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

Different behaviour between Clang and GCC when performing qualified name lookup

本文关键字:查找 定名称 GCC 执行 Clang      更新时间:2023-10-16

考虑以下程序:

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

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

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

Clang在这点上是正确的。引用c++ 11.3.4.3/1 [basic.lookup. quality]:

…如果是::嵌套名称说明符中的作用域解析操作符前面没有decltype说明符,查找::前面的name只考虑特化为类型的名称空间、类型和模板。如果找到的名称没有指定命名空间或类、枚举或依赖类型,则程序是不规范的。

根据该子句,在查找过程中应该考虑类型,因此应该找到typedef N。由于它没有指定名称空间、类、枚举或依赖类型,因此程序是病态的。