c++ - 这是有效的 C++ 代码吗?

标签 c++ visual-studio-2005 g++

我有以下代码,基本上是,

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/

相关文章:

c# - C#2.0中使用HashSet,兼容3.5

c++ - VC2012错误C2676,VC2005错误C2784 : reverse_iterator for map of template classes

unit-testing - 用于单元测试的 TestDrive.net 'Visual Studio add in' 的开源替代方案?

c++ - g++ 编译顺序重要吗?

c++ - Clang 链接器不查看 LD_LIBRARY_PATH

c++ - 将 int 与 string 和 getline 一起使用没有错误

c++ - MVS C++ 错误 : string subscript out of range

c++ - OpenMP 最小值缩减和 std::min

c++ - strncpy 和 strcat 没有按照我认为的方式工作 C++

c++ - 有没有什么方法可以提取 Boost Regex,以便我可以将它打包到我的项目中?