这是我的代码:
#include <vector>
int main()
{
std::vector<int> a = {1, 2.2};
}正如预期的那样,由于非法的缩窄转换,这不会编译:
$ clang++ -std=c++11 foo.cpp
foo.cpp:5:30: error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
std::vector<int> a = {1, 2.2};
^~~为什么这个编译时只带一个警告?
#include <complex>
int main()
{
std::complex<int> a = {1, 2.2};
}以下是警告:
$ clang++ -std=c++11 foo.cpp
foo.cpp:5:31: warning: implicit conversion from 'double' to 'std::__1::complex<int>::value_type' (aka 'int') changes value from 2.2 to 2 [-Wliteral-conversion]
std::complex<int> a = {1, 2.2};
~ ^~~
1 warning generated.我理解诊断的概念,并且只需要C++编译器以错误或警告的形式发出诊断。
但我想确定我在这里没有误解任何概念。特别是,我想知道是否有任何C++概念,我需要知道为什么在第一种情况下c++11-narrowing诊断被发布,而在第二种情况下,literal-conversion诊断被发布。
发布于 2018-05-22 14:02:02
正在发生两种不同的事情,正如您所看到的,这会导致不同的诊断:
std::vector的构造函数,它接受一个std::initializer_lsit。LiteralType上使用复制列表初始化,这将导致聚合初始化。它们都应该防止缩小转换,但似乎clang实现诊断的方式不同。
https://stackoverflow.com/questions/50469556
复制相似问题