Xcode推断命名空间? 前段代码在XCODEL中编译,但在VisualStudio中没有编译(在第三到最后一行中,用 Bar:未声明的标识符< /代码>),哪一个更符合C++标准。我假设clang是以一种专有的非标准方式为Bar推断出正确的命名空间的?

Xcode推断命名空间? 前段代码在XCODEL中编译,但在VisualStudio中没有编译(在第三到最后一行中,用 Bar:未声明的标识符< /代码>),哪一个更符合C++标准。我假设clang是以一种专有的非标准方式为Bar推断出正确的命名空间的?,c++,visual-c++,clang,standards,C++,Visual C++,Clang,Standards,clang是正确的,因为标准中有一条模糊但有用的规则([basic.lookup.qual]/3): 在声明器id为限定id的声明中,在声明限定id之前使用的名称 在定义命名空间范围中查找;在范围中查找限定id后面的名称 成员的类或命名空间的名称 也就是说,一旦编译器发现被定义的实体,foooclass::do_stuff,是一个类的成员,它就会在foooclass的范围内查找该声明中的以下所有名称。这意味着查找Bar首先要查找Foo::Foo::foooclass的成员,然后是Foo::Foo

clang是正确的,因为标准中有一条模糊但有用的规则([basic.lookup.qual]/3):

在声明器id为限定id的声明中,在声明限定id之前使用的名称 在定义命名空间范围中查找;在范围中查找限定id后面的名称 成员的类或命名空间的名称


也就是说,一旦编译器发现被定义的实体,
foooclass::do_stuff
,是一个类的成员,它就会在
foooclass
的范围内查找该声明中的以下所有名称。这意味着查找
Bar
首先要查找
Foo::Foo::foooclass
的成员,然后是
Foo::Foo
的成员,然后是
Foo
的成员,然后是全局范围。由于在
Foo
中找到了
Bar
,因此名称查找成功。

GCC 7.0.1也能正常工作,因此可能是MSVC的错误。
namespace Foo {
  class Bar { };
}

namespace Foo {
  namespace Foo {
    class FooFooClass {
      public:
        void do_stuff(Bar& key);
    };
  }
}

using namespace Foo::Foo;

void FooFooClass::do_stuff(Bar& key) {

}