9

可能重复:
为什么编译器支持冗余范围限定,它是否合法?

我不希望它编译,但它确实。这可能是编译器错误,还是有一些正确的含义?

$ 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
4

1 回答 1

9

是的,这是合法的。一个类的名称被插入到它自己的命名空间中,称为注入类名称。从 C++03 §9/2 开始:

[...]类名也被插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。

请注意,Log::Log命名类构造函数,这仅在某些上下文中允许,但只要您以非(例如)的Log::Log::...其他内容结束链,那么它就不会命名构造函数。具体来说,§3.4.3.1/1a 说:Logfn

如果nested-name-specifier指定了一个 class C,并且在nested-name-specifierC之后指定的名称,当C在类C。这样的构造函数名称应仅在出现在类定义之外的构造函数定义的declarator-id中使用。

于 2012-10-11T16:14:15.387 回答