基础说明符的全局资格

时间:2011-08-15 17:22:25

标签: c++ c++11

作为“What is this crazy C++11 syntax ==> struct : bar {} foo {};?”的后续内容,我希望编译以下C ++ 0x代码:

struct x {};
struct :::x {} y {};

然而,GCC 4.7.0 20110731告诉我:

  

错误:在':'标记

之前,类名的全局限定无效

当我退回理智并给第二个UDT命名时:

struct x {};
struct a:::x {} y{}; // remember, identical to `a::: x` or `a: ::x` or `a:: :x` etc

错误是:

  

错误:'a'尚未声明


这三个冒号似乎像<::> <:>而不是<:> <::>一样被贬低,但这可以从 [final draft] 标准中明确推断出来吗?

问题“Global qualification in a class declarations class-head”可能是相关的吗?

2 个答案:

答案 0 :(得分:6)

  

似乎三个冒号被像le&lt; ::&gt; &LT;产品:&gt;宁   比&lt;:&gt; &lt; ::&gt;,但这可以从[最终草案]中明确推断出来   标准?

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

答案 1 :(得分:6)

这与解析有关。来自§2.5.3

  
    

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

  

基本上,它必须采用最长的字符序列,因此:::始终被解析为:: :,其方式与x+++y始终被解析为{ {1}} x ++ +

这称为Maximal Munch解析。