c ++ 0x:解决函数定义后跟空声明和简单声明之间的歧义

时间:2011-08-11 17:15:18

标签: c++ parsing c++11 specifications

我在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结尾?

1 个答案:

答案 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;
};