可能重复:
为什么编译器支持冗余范围限定,是否合法?
我不希望这会编译,但确实如此.这可能是一个编译器错误,还是有一些正确的含义?
$ g++ -c scopes.cpp
$ cat scopes.cpp
class Log {
public:
Log() { }
static void fn() { }
};
void test() {
Log::Log::Log::Log::Log::Log::fn();
}
$ g++ --version
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
Run Code Online (Sandbox Code Playgroud)
是的,这是合法的.类的名称将插入其自己的名称空间中,该名称空间称为inject-class-name.来自C++03§9/ 2:
[...] 类名也插入到类本身的范围内; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.
请注意,Log::Log类构造函数的名称只能在某些上下文中使用,但只要您Log::Log::...使用除Log(例如fn)之外的其他内容结束链,则它不会命名构造函数.具体而言,§3.4.3.1/ 1a说:
如果nested-name-specifier指定一个类
C,并且在查找嵌套名称说明符之后指定C的名称是C(第9节)的inject-name-name ,则该名称将被视为命名构造函数班级C.这样的构造函数名称只能在出现在类定义之外的构造函数定义的declarator-id中使用.