我有以下代码,基本上是,
class foo {
public:
void method();
};
void foo::foo::method() { }
我不小心在 foo::method 的定义前面添加了一个额外的 foo::。这段代码使用 g++(ver 4.2.3) 在没有警告的情况下编译,但使用 Visual Studio 2005 时出错。我没有名为 foo 的命名空间。
哪个编译器是正确的?
最佳答案
如果我正确阅读标准,g++是对的,VS是错的。
ISO-IEC 14882-2003(E), §9.2 Classes (pag.153):类名被插入到在类之后立即声明的范围内-name 可见。类名也被插入到类本身的范围内;这被称为注入(inject)类名。出于访问检查的目的,注入(inject)的类名被视为公共(public)成员名。
根据以下评论,保留以下有关实际名称查找规则的内容也特别有用:
ISO-IEC 14882-2003(E),§3.4-3 名称查找(第 29 页):类的注入(inject)类名称(第 9 条)也是出于名称隐藏和查找的目的,被认为是该类的成员。
考虑到 9.2 文本的最后一部分,如果不是这样,那就太奇怪了。但正如 litb 评论的那样,这让我们确信 g++ 确实对标准做出了正确的解释。没有留下任何问题。
关于c++ - 这是有效的 C++ 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263825/