最近,我看到了一个奇怪的C++特性:注入类名.
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚为什么这个功能是必要的.有没有需要此功能的练习?
我听说旧C++中不存在这个功能.然后,什么时候介绍?C++ 03?C++ 11?
考虑以下代码:
struct foo{};
int main() {
foo::foo a;
}
Run Code Online (Sandbox Code Playgroud)
我希望这个格式正确,foo通过[class]/2中的规则声明一个类型的变量(N4140,强调我的):
一个类名被插入在其中后立即宣布的范围类的名字能够被看见. 的类名也被插入到类本身的范围 ; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.
clang 3.6.0同意我的意见,编译上面的代码没有适用的警告-Wall -pedantic.
gcc 5.2.0 不同意,提供以下错误消息:
main.cpp: In function 'int main()':
main.cpp:5:5: error: 'foo::foo' names the constructor, not the type
foo::foo a;
Run Code Online (Sandbox Code Playgroud)
无论注入的类名称的嵌套有多深,例如,上述情况都适用foo::foo::foo::foo.
是否存在强制该构造在该上下文中被解释为构造函数的规则,或者这是一个gcc错误?或者我是否错误地解释标准报价?