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

protected:
    Foo  x, y,;

我本来以为逗号后面会是一个错误,但是显然不是吗?这是未定义的,还是会发生什么?大概是不好的事情,因为代码检查程序对此有所提示。

最佳答案

相关的语法生成在第9.2节中:

member-declarator-list:
  member-declarator
  member-declarator-list , 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

错误的语法不是未定义的行为。允许放错逗号的编译器存在错误。拒绝这种事情是标准的要求。

请注意,枚举定义和大括号初始化器中允许使用逗号结尾。我认为这两种情况都是C++ 11所添加的,以简化源代码生成器的编写。 (即使有这么简单的要求,通常也能胜任这一工作的预处理器也很难过。)通常,简单的生成器可能会避免创建具有多个名称的声明,因为由于语法复杂,它是蠕虫的 jar 头。另一方面,允许一个由;组成的空声明,以及一个成员函数定义后的分号。

10-06 01:57