为什么下面的代码在不同的编译器上打印出不同的结果?

#include <iostream>

void foo() { std::cout << "::foo() \n"; }

namespace Foo
{
   struct Bar
   {
      friend void foo() { std::cout << "Bar::foo() \n"; }
      void bar() { foo(); }
      void baz();
   };

   void Bar::baz() { foo(); }
}

int main()
{
   Foo::Bar instance;
   instance.bar();
   instance.baz();
}

输出

海湾合作委员会 4.7.2



MSVC-10.0



MSVC-11.0



谁是对的?为什么会这样?

最佳答案

我认为 gcc 是对的:

C++11 中的 7.3.1.2/3:



C++03 在同一个地方有类似的语言。

我不确定为什么 MSVC-11 找不到 ::foo ,但我想您可以阅读此文本,这意味着根本无法查找名称 foo 。我认为预期的含义是最里面的封闭命名空间中的名称找不到,但外部范围中拼写相同的名称可以。但是,如果微软想要争论预期的含义,我不是他们会与之争论的人。

MSVC-10是错误的,因为它找到了一个标准具体说的名字没有找到。因此,对 MSVC-11 行为的解释可能就像“它被报告为 10 中的错误,他们试图修复它但做得太过分了”。

无论如何,解决方法是在命名空间 foo 中引入 Foo 的声明:

namespace Foo
{
   void foo(); // this is a matching declaration
   struct Bar
   {
      friend void foo() { std::cout << "Bar::foo() \n"; }
      void bar() { foo(); }
      void baz();
   };

   void Bar::baz() { foo(); }
}

这使得 gcc 找到友元函数。我还没有在任何版本的 MSVC 上测试过。

关于c++ - 不同编译器的不同输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13938037/

10-16 23:35