作为“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”可能是相关的吗?
答案 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解析。