谁是正确的,海湾合作委员会或MSVC?

时间:2016-11-18 10:31:43

标签: c++ visual-studio gcc namespaces name-lookup

假设我们有这样的结构:

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错误?标准对此有何看法?

1 个答案:

答案 0 :(得分:4)

这与C ++ 17功能无关,它没有触及using-directives,也没有使用using-directives。 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

  

对于类X的成员,在[...]的定义中使用了[...]   遵循X定义之外的类成员   成员的 declarator-id ,应在以下其中一项中声明   方法:

     
      
  • 在用于使用它的块之前或在封闭块([stmt.block])或

  • 中使用之前   
  • 应该是类X的成员,或者是X([class.member.lookup])基类的成员,或者

  •   
  • [...关于嵌套和本地类的两个要点......]

  •   
  • 如果X是名称空间N [...]的成员,则在使用名称之前,在名称空间NN之一中封闭名称空间。

  •   

types的名称查找应首先查看bar内部,然后查看classes内部,然后查看some_namespace内部。最后一个应该找到名称空间types