我在解决c++ 0x规范中的明显歧义时遇到问题,另请参见:http://www.nongnu.org/hcb/

假设我们有代码

void foo() {};

我个人将代码解释为function-definitionempty-declaration。但是,看一下语法规范,我会说这可以像simple-declaration一样容易地解释,它是block-declaration的一部分,因此在declaration列表中很快提到了...

这是我对如何将其解析为简单声明的解释:
void foo() {};"

->简单声明
void

-> decl-specifier-seq-> decl-specifier->类型说明符->尾随类型-
说明符->简单类型说明符
foo() {}

->初始化声明者列表->初始化声明者
foo()

->声明器-> ptr-声明器-> noptr-声明器
foo

->声明者ID-> ...
()

->参数和限定符
{}

->初始化程序-> braced-init-list

因此,应该可以将其解析为简单声明。

有人告诉我应该使用规范的6.8来消除这种情况的歧义,但是我不太明白为什么。因为simple-declarationexpression-statement结尾,所以它是;吗?

最佳答案

我想你是对的。这是模棱两可的,我不知道有什么段落可以解决此问题。

C++ 0x规范中还有其他不确定性,没有明确解决,但是(希望)编译器可以直接实现。例如,可以将以下内容解析为嵌套类B的定义和具有基础类型0struct B大小的未命名位域的定义。后一种解释将使程序无效)。

struct C { constexpr operator int() { return 0; } };
struct A { struct B : C { }; };

另一个例子
struct A {
  // is 0 a 'brace-or-equal-initializer' or a 'pure-specifier'?
  virtual void f() = 0;
};

Clang最近不得不修复以下问题,因为它得到了错误的方式(将其解析为初始化变量f,而不是使函数变纯)。
typedef void T();
struct B : A {
  // B::f overrides A::f
  T f = 0;
};

10-07 18:56