c ++,尾随逗号怎么不是错误,会发生什么?Foo x,y ,;

pet*_*sev 3 c++ syntax undefined-behavior

有人向我指出,我在某些c ++代码中看起来像是一个拼写错误:

protected:
    Foo  x, y,;
Run Code Online (Sandbox Code Playgroud)

我原本以为尾随的逗号会出错,但显然它不是?这是不确定的,或者会发生什么?可能是坏事,因为代码检查程序抱怨它.

Pot*_*ter 6

相关的语法产生见§9.2:

member-declarator-list:
  member-declarator
  member-declarator-list , member-declarator
Run Code Online (Sandbox Code Playgroud)

逗号只允许分隔声明符(名称).member-declarator本身可能不包含逗号.

编辑:这里是成员声明者 ...它不是自包含的,声明者的语法通常是一个蜘蛛网.

member-declarator:
  declarator virt-specifier-seq(opt) pure-specifier(opt)
  declarator brace-or-equal-initializer(opt)
  identifier(opt) attribute-specifier-seq(opt) : constant-expression
Run Code Online (Sandbox Code Playgroud)

不正确的语法不是未定义的行为; 允许错误放置逗号的编译器有一个错误.拒绝那种东西是标准的要求.

注意,枚举定义和大括号初始化器中允许使用尾随逗号.我认为这两个案例都是由C++ 11添加的,以简化编写源代码生成器.(即使有这么简单的要求,预处理器也经常会遇到困难.)通常,简单的生成器可能会避免创建具有多个名称的声明,因为由于语法复杂,它可能是一堆蠕虫.另一方面,;允许包含空的声明,如成员函数定义后的分号.