考虑以下程序:

#include <iostream>

namespace N {
    int j = 1;
}

namespace M {
    typedef int N;
    void f() {
        std::cout << N::j << std::endl;
    }
}

int main() { M::f(); }

使用clang进行编译会产生以下编译器错误:
prog.cc:10:22: error: 'N' (aka 'int') is not a class, namespace, or
enumeration
    std::cout << N::j << std::endl;
                 ^ 1 error generated.

GCC没有给出任何编译器错误。我试图弄清楚应该为哪个编译器提交错误报告。哪个编译器具有正确的行为,以及为什么(引用c++标准)?

Wandbox-lang:http://melpon.org/wandbox/permlink/s0hKOxCFPgq5aSmJ

Wandbox-GCC:http://melpon.org/wandbox/permlink/i2kOl3qTBVUcJVbZ

最佳答案

lang是正确的。引用C++ 11,3.4.3/1 [basic.lookup.qual]:



根据此子句,应该在查找期间考虑类型,因此应找到typedef N。并且由于它没有指定 namespace ,类,枚举或依赖类型,因此程序格式错误。

关于c++ - 执行合格的名称查找时,Clang和GCC之间的行为不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31464771/

10-11 18:13