【发布时间】:2016-11-18 10:31:43
【问题描述】:
假设我们有这样的结构:
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 错误?标准对此有何规定?
【问题讨论】:
-
不只是 GCC 和 MSVC 以不同的速率和不同的优先级实施新标准。
-
在 the standard 中的
nested-name-specifier上找不到任何关于将其命名空间带入 using 命名空间的信息,但它在 somewhere 那里。 -
诚然,我还没有详细阅读嵌套命名空间规范,但我希望这不应该编译。使用子命名空间不应使用其父命名空间。那么编译器怎么知道
types::foo_t在函数定义中真的意味着some_namespace::types::foo_t呢? -
@NicolBolas [basic.lookup.unqual]/8。 declarator-id 之后的名称被查找,就好像它们在成员函数体中一样,即首先在类中,然后在类的封闭命名空间中。
标签: c++ visual-studio gcc namespaces name-lookup