基本说明符中的全局限定

Global qualification in base specifier

本文关键字:全局 说明符      更新时间:2023-10-16

作为"这是什么疯狂的c++ 11语法==>Struct: bar {} foo {};?,我希望编译以下c++ 0x代码:

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

但是GCC 4.7.0 20110731告诉我:

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

当我回过头来为第二个UDT命名时:

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

错误是:

错误:'a'未被声明


似乎三个冒号被命名为<::> <:>而不是<:> <::>,但是这可以从[最终草案]标准中清楚地推断出来吗?

和"类声明类头中的全局限定"这个问题是否相关?

这只是为了解析。从§2.5.3

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

基本上,它必须采用最长的字符序列,因此:::总是被解析为:: :,就像x+++y总是被解析为x ++ + y一样。

这被称为maximum Munch解析

看起来这三个冒号像<::> <:>一样被简化了然后<:> <::>,但这能从[最终草案]中清楚地推断出来吗?标准吗?

它不再是[最终]草稿了。它已经被一致接受了。是的,可以推断:::将被解析为::,然后是:。这纯粹是一个词汇问题。与c++ 03一样,该令牌被视为最长的令牌。在c++ 03中,这导致模板关闭>>被视为移位操作符。在c++ 0x中,对于这种特殊情况有一个例外,但是一般规则仍然适用(参见2.5.3)。例如,++将被解析为++后面跟着+,而不是相反