Xcode推断命名空间? 前段代码在XCODEL中编译,但在VisualStudio中没有编译(在第三到最后一行中,用 Bar:未声明的标识符< /代码>),哪一个更符合C++标准。我假设clang是以一种专有的非标准方式为Bar推断出正确的命名空间的?
clang是正确的,因为标准中有一条模糊但有用的规则([basic.lookup.qual]/3): 在声明器id为限定id的声明中,在声明限定id之前使用的名称 在定义命名空间范围中查找;在范围中查找限定id后面的名称 成员的类或命名空间的名称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
也就是说,一旦编译器发现被定义的实体,
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) {
}