【问题标题】:c++0x: resolving ambiguity between function-definition followed by empty-declaration and simple-declarationc++0x:解决函数定义后跟空声明和简单声明之间的歧义
【发布时间】:2011-08-11 17:15:18
【问题描述】:

我在思考 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 -> type-specifier -> trailing-type- 说明符 -> 简单类型说明符

foo() {}

-> 初始化声明器列表-> 初始化声明器

foo()

-> 声明符 -> ptr 声明符 -> noptr 声明符

foo

-> 声明符-id -> ...

()

-> 参数和限定符

{} 

-> 初始化器 -> 大括号初始化列表

所以这应该可以被解析为一个简单的声明。

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

【问题讨论】:

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


    【解决方案1】:

    我认为你是对的。这是一个模棱两可的地方,我不知道在规范中解决它的段落。

    C++0x 规范中还有其他未明确解决的歧义,但(希望)将由编译器以直接的方式实现。例如,以下内容既可以解析为嵌套类B 的定义,也可以解析为底层类型struct B 的大小为0 的未命名位域的定义。后一种解释会使程序无效)。

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

    【讨论】:

    • wait... constexpr operator int() 表示 类标识符 C 在编译时可以转换为 int 吗?不是 constexpr C 类型的对象将转换为 int 吗? (就像在struct A { static const C c; struct B : c {}; }; 中一样,它是一个零长度的位域成员,但我希望你明白这一点)
    • @Alex C{} 是一个构造值 C 对象。
    • 啊,我明白了。好的例子。谢谢
    • 为了让你的第一个例子工作,C{} 也必须是constexpr(因为类实例需要在编译时创建),所以构造函数需要声明为constexpr
    • @Nicol C 的构造函数没有被调用。它是值初始化,C 的默认构造函数很简单。所以根据第 8.5 条的规则,我们没有调用任何构造函数。但不管这一点,C 的隐式声明构造函数是 constexpr 由12.1p6 和7.1.5 的规则。但无论如何,这些都是语义上的考虑。在任何情况下,代码在语义上都是错误的。 C{} 是否是有效的 const 表达式无关紧要。可以解析为一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多