为什么下面的代码在不同的编译器上打印出不同的结果?
#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/