Clang和GCC在执行限定名称查找时的不同行为
Different behaviour between Clang and GCC when performing qualified 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++标准)?
魔杖盒- 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
。由于它没有指定名称空间、类、枚举或依赖类型,因此程序是病态的。
相关文章:
- 模板元程序查找相似的连续类型名称
- 折叠表达式和函数名称查找
- enable_if继承的成员函数的名称查找错误
- 限定的依赖名称查找,其中包含基类的注入类名
- 假设声明中某些上下文中需要的名称查找规则是什么
- 尝试了解模板和名称查找
- 哪里定义了查找名称最直接声明的名称查找规则
- 模板库中的名称查找:为什么我们要添加这个>
- DEV C++ 第 69 行 [错误] ISO "for" 范围更改了"i"的名称查找 [-允许]
- 重载解析、名称查找和函数指针
- 在 c++ 中按地址查找可变名称
- C++中名称查找和名称绑定之间的区别
- C 查找因名称
- 功能查找和名称空间
- 如何使用调用和别名指令在 llvm 字节码中查找函数名称
- 如何在 QML 文件中查找属性名称为字符串的 QML 上下文属性
- using声明如何减少可用于在没有 ADL 的情况下查找的名称
- 在模板实例化中查找从属名称C++
- 如何查找声明名称空间变量的文件
- 在模板参数中查找类型名称的类型名称