我在c ++ 0x规范中明显含糊不清时遇到了问题,另见:http://www.nongnu.org/hcb/
假设我们有代码
void foo() {};
我个人将代码解释为function-definition
后跟empty-declaration
。但是,看一下语法规范,我说这可以很容易地被解释为simple-declaration
,它是block-declaration
的一部分,因此在{{1}的列表中更快地提到}} ...
以下是关于如何将其解析为简单声明的解释:
declaration
- >简单声明
void foo() {};"
- > decl-specifier-seq - > decl-specifier - > type-specifier - >尾随-类型 - 说明符 - >简单型说明符
void
- > init declarator-list - > INIT声明符
foo() {}
- >声明者 - > ptr-declarator - > noptr声明符
foo()
- > declarator-id - > ...
foo
- >参数和 - 限定符
()
- >初始化程序 - >支撑-INIT列表
所以这应该可以解析为简单声明。
我被告知应该使用6.8的规范来消除这种情况的歧义,但我不太明白为什么。是{}
和simple-declaration
,因为它以expression-statement
结尾?
答案 0 :(得分:9)
我认为你是对的。这是一个含糊不清的问题,我不知道在规范中解决它的段落。
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;
};