我在解决c++ 0x规范中的明显歧义时遇到问题,另请参见:http://www.nongnu.org/hcb/
假设我们有代码
void foo() {};
我个人将代码解释为
function-definition
和empty-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-declaration
以expression-statement
结尾,所以它是;
吗? 最佳答案
我想你是对的。这是模棱两可的,我不知道有什么段落可以解决此问题。
C++ 0x规范中还有其他不确定性,没有明确解决,但是(希望)编译器可以直接实现。例如,可以将以下内容解析为嵌套类B
的定义和具有基础类型0
的struct 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;
};