首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++0x:解决函数定义后跟空声明和简单声明之间的歧义

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

Stack Overflow用户
提问于 2011-08-12 01:15:18
回答 1查看 492关注 0票数 15

我对c++0x规范中明显的模棱两可感到困惑,另请参阅:http://www.nongnu.org/hcb/

假设我们有代码

代码语言:javascript
复制
void foo() {};

就我个人而言,我将代码解释为后跟empty-declarationfunction-definition。但是,看一下语法规范,我会说这可以很容易地解释为simple-declaration,它是block-declaration的一部分,因此在declaration列表中较早提到...

以下是我对如何将其解析为简单声明的解释:

代码语言:javascript
复制
void foo() {};"

->简单声明

代码语言:javascript
复制
void

-> decl-说明符-序列-> decl-说明符->类型说明符->结尾类型说明符->简单类型说明符

代码语言:javascript
复制
foo() {}

->初始化声明程序-列出->初始化声明程序

代码语言:javascript
复制
foo()

->声明程序-> ptr-声明程序-> noptr-声明程序

代码语言:javascript
复制
foo

->声明符id -> ...

代码语言:javascript
复制
()

->参数和限定符

代码语言:javascript
复制
{} 

->初始值设定项->带括号的初始化列表

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-12 01:43:07

我想你是对的。这是一个模棱两可的问题,我不知道规范中有没有解决这个问题的段落。

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

代码语言:javascript
复制
struct C { constexpr operator int() { return 0; } }; 
struct A { struct B : C { }; };

另一个例子

代码语言:javascript
复制
struct A {
  // is 0 a 'brace-or-equal-initializer' or a 'pure-specifier'?
  virtual void f() = 0;
};

Clang最近不得不修复以下问题,因为它得到了错误的方法(它将其解析为初始化变量f,而不是使函数成为纯函数)。

代码语言:javascript
复制
typedef void T();
struct B : A {
  // B::f overrides A::f
  T f = 0;
};
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7030102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档