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

2024-01-03

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

class foo {
  public:
    void method();
};

void foo::foo::method() { }

我不小心在 foo::method 的定义前面添加了一个额外的 foo:: 。此代码使用 g++(版本 4.2.3)编译时没有警告,但使用 Visual Studio 2005 时出错。我没有名为 foo 的命名空间。

哪个编译器是正确的?


如果我正确地阅读了标准,g++是正确的,而VS是错误的。

ISO-IEC 14882-2003(E),§9.2 等级(第 153 页): 类名在看到类名后立即插入到声明它的范围中。类名也被插入到类本身的范围中;这称为注入类名。出于访问检查的目的,注入的类名称被视为公共成员名称。

根据下面的评论,保留以下有关实际名称查找规则的内容也特别有用:

ISO-IEC 14882-2003(E),§3.4-3 名称查找(第 29 页): 出于名称隐藏和查找的目的,类的注入类名(第 9 条)也被视为该类的成员。

考虑到文本的最后部分为 9.2,如果不是的话那就很奇怪了。但正如 litb 评论的那样,这让我们放心,g++ 确实正在对标准做出正确的解释。没有问题了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是有效的 C++ 代码吗? 的相关文章

随机推荐