9

考虑以下程序:

#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++ 标准的引用)?

魔杖盒-Clang:http ://melpon.org/wandbox/permlink/s0hKOxCFPgq5aSmJ

魔杖盒 - GCC:http ://melpon.org/wandbox/permlink/i2kOl3qTBVUcJVbZ

4

1 回答 1

11

Clang 在这一点上是正确的。引用 C++11、3.4.3/1 [basic.lookup.qual]:

... 如果嵌套名称说明:: 符中的范围解析运算符前面没有decltype 说明符,则查找前面的名称仅考虑名称空间、类型和特化为类型的模板。如果找到的名称没有指定命名空间或类、枚举或依赖类型,则程序是非良构的。::

根据这个子句,在查找期间应该考虑类型,因此N应该找到 typedef。而且由于它没有指定命名空间、类、枚举或依赖类型,因此程序是非良构的。

于 2015-07-16T21:28:53.997 回答