最近,在将库更新到Clang 5.x时,我注意到我的代码中的一个错误,该错误先前已在Clang 4.x,GCC 5.x-6.x和MSVC 2015和2017上编译。
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
using a = typename std::vector<int>::vector;
std::cout << typeid(a).name() << std::endl;
return 0;
}
Clang-5.x产生以下警告消息,而所有其他编译器以静默方式编译上述代码:
a.cpp:7:42: warning: ISO C++ specifies that qualified reference to 'vector' is a
constructor name rather than a type in this context, despite preceding
'typename' keyword [-Winjected-class-name]
using a = typename std::vector<int>::vector;
哪个编译器有问题?假设Clang5.x在此处具有正确的行为,并且所有其他编译器(和版本)都不正确,我是否正确。如果是这样,是否值得向MSVC和GCC提交错误报告?
答案 0 :(得分:12)
Clang-5非常正确。在[class.qual]/2:
在查找中,不忽略函数名称和 嵌套名称说明符 指定C类:
- 如果在嵌套名称说明符之后指定的名称,在C中查找时为,则为C的注入类名称
- ...
该名称被视为命名C类构造函数。
至于问题的其他部分。是的,提交错误报告绝对值得。 IMO鼓励遵守标准(或至少更多诊断依据)。