假设我们具有以下结构:
namespace some_namespace::types {
using foo_t = int;
}
namespace some_namespace::classes {
class bar {
public:
auto do_stuff() -> types::foo_t;
};
}
using namespace some_namespace::classes;
auto bar::do_stuff() -> types::foo_t {
return 1;
}
这段代码可以在GCC6中愉快地编译。
另一方面,启用了
/std:c++latest
开关的VS15无法识别do_stuff
的返回类型。它返回C2653。现在,我发现高度可疑的是通过将后半部分更改为以下内容来解决此问题:
using namespace some_namespace;
auto classes::bar::do_stuff() -> types::foo_t {
return 1;
}
在我看来应该是平等的。我误以为这是MSVC错误吗?标准对此有何说法?
最佳答案
这与C++ 17功能无关,后者不涉及using指令,也完全没有涉及using指令。 MSVC从产生相同的错误
namespace some_namespace{
namespace types {
using foo_t = int;
}
namespace classes {
class bar {
public:
auto do_stuff() -> types::foo_t;
};
}
}
using some_namespace::classes::bar;
auto bar::do_stuff() -> types::foo_t {
return 1;
}
[basic.lookup.unqual]/8:
types
的名称查找应首先在bar
内部,然后在classes
内部,然后在some_namespace
内部。最后一个应该找到命名空间types
。关于c++ - 在这里,谁是正确的,GCC还是MSVC?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40674779/