基础说明符的全局资格

Lig*_*ica 1 c++ c++11

作为" 什么是这个疯狂的C++ 11语法==> struct:bar {} foo {};? "的后续内容,我希望编译以下C++ 0x代码:

struct x {};
struct :::x {} y {};
Run Code Online (Sandbox Code Playgroud)

但是,GCC 4.7.0 20110731告诉我:

错误:在':'标记之前,类名的全局限定无效

当我退一步走向理智并为第二个UDT命名时:

struct x {};
struct a:::x {} y{}; // remember, identical to `a::: x` or `a: ::x` or `a:: :x` etc
Run Code Online (Sandbox Code Playgroud)

错误是:

错误:'a'尚未声明


看起来这三个冒号是被贬低<::> <:>而不是<:> <::>,但是这可以从[最终草案]标准中明确推断出来吗?

也许问题" 班级宣言班级的全球资格 "是否相关?

Arm*_*yan 6

看起来这三个冒号像<:> <:>而不是<:> <::>一样,但这可以从[最终草案]标准中明确推断出来吗?

这不再是[最终]选秀.它已被一致接受.是的,可以推断出:::将被解析为::后面跟着:.这是一个纯粹的词汇问题.与在C++ 03中一样,令牌被视为最长的令牌.在C++ 03中,导致模板关闭的>>s被认为是移位运算符.在C++ 0x中,已经为这种特殊情况做了一个例外,但是一般规则仍然适用(参见2.5.3).例如,+++将被解析为++,然后是+,反之亦然

  • 我们在发布之前唯一的文件是最终草案.最终草案已被一致接受,但这并不能阻止它成为最终草案.:) (3认同)

Pet*_*der 6

这与解析有关.来自§2.5.3

如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列,即使这会导致进一步的词法分析失败.

基本上,它必须采用最长的字符序列,因此:::始终按照始终解析为:: :的相同方式x+++y进行解析x ++ + y.

这被称为Maximal Munch解析.