是否可以指定重复的C ++类范围?

时间:2012-10-11 16:06:34

标签: c++ g++

  

可能重复:
  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

1 个答案:

答案 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 中使用   出现在类定义之外。