假设我们具有以下结构:

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/

10-12 18:04