执行限定名称查找时,Clang和GCC之间的行为不同

时间:2015-07-16 21:21:52

标签: c++ namespaces typedef language-lawyer name-lookup

考虑以下计划:

#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不会给出任何编译器错误。我正在试图找出我应该为bug报告提交的编译器。哪个编译器具有正确的行为和原因(对c ++标准的引用)?

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

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

1 个答案:

答案 0 :(得分:11)

Clang在这个问题上是正确的。引用C ++ 11,3.4.3 / 1 [basic.lookup.qual]:

  

...如果是::   嵌套名称说明符中的作用域解析运算符前面没有 decltype-specifier,查找   ::之前的名称仅考虑其专业化类型的名称空间,类型和模板。   如果找到的名称未指定命名空间或类,枚举或依赖类型,则为程序   是不正确的。

根据此子句,在查找期间应考虑类型,因此应找到typedef N。由于它没有指定命名空间,类,枚举或依赖类型,因此该程序格式不正确。