可能重复:
Why are redundant scope qualifications supported by the compiler, and is it legal?
我不希望这会编译,但确实如此。这可能是一个编译器错误,还是它有一些正确的含义?
$ 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
答案 0 :(得分:9)
是的,这是合法的。类的名称将插入到自己的名称空间中,该名称空间称为 inject-class-name 。来自C ++03§9/ 2:
[...] class-name 也被插入到类本身的范围内;这被称为 inject-class-name 。 出于访问检查的目的, inject-class-name 被视为公共成员名称。
请注意,Log::Log
命名类构造函数,这只能在某些上下文中使用,但只要您使用Log::Log::...
之外的其他内容结束Log
链(例如{ {1}}),然后它没有命名构造函数。具体而言,§3.4.3.1/ 1a说:
如果嵌套名称说明符指定类
fn
,并且在嵌套名称说明符之后指定名称, 当在C
中查找时,注入类名为C
(第9条),而是将名称视为名称 类C
的构造函数。这样的构造函数名称只能在构造函数定义的 declarator-id 中使用 出现在类定义之外。