隐式转换警告 int 到 int-lookalike

say*_*nel 3 c++ signed type-conversion truncation compiler-warnings

我的编译器对很多隐式转换感到很温暖:

有些我确实理解,比如

implicit conversion changes signedness: 'int' to 'std::vector::size_type' (aka 'unsigned long')` 
Run Code Online (Sandbox Code Playgroud)

当我做myvector.resize(myInt)

其他比较晦涩难懂的,比如

implicit conversion loses integer precision: 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size_type' (aka 'unsigned long') to 'int'
Run Code Online (Sandbox Code Playgroud)

当我这样做时myInt=myString.size(),或者

implicit conversion changes signedness: 'int' to 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size_type' (aka 'unsigned long')
Run Code Online (Sandbox Code Playgroud)

当我打电话时myString[myInt]

在所有情况下,我确实理解为什么我收到这些消息(int-uint 等),但是它们在程序中的使用是明确的。如果我不更改变量类型来删除这些警告,我会面临什么风险?我以前的编译器没有警告我任何东西,所以当我更换电脑时,我突然收到了几十个警告。

L. *_* F. 5

在所有情况下,我确实理解为什么我收到这些消息(int-uint 等),但是它们在程序中的使用是明确的。如果我不更改变量类型来删除这些警告,我会面临什么风险?

这不是含糊不清的问题。如果将有符号值转换为无符号类型,可能会得到奇怪的结果:

long i = -2147483645;        // for example

std::vector<int> vec{0, 1, 2, 3, 4};
std::cout << vec[i] << "\n"; // undefined behavior, not always caught
Run Code Online (Sandbox Code Playgroud)

这里,假设是 32 位系统,在传递给 之前i先转换为,从而导致未定义的行为。2147483651operator[]

如果您确实确定转换是无害的,您可以执行以下操作static_cast

static_cast<std::vector<int>::size_type>(i)
Run Code Online (Sandbox Code Playgroud)

我以前的编译器没有警告我任何东西,所以当我更换电脑时,我突然收到了几十个警告。

始终打开警告。 至少这样做-Wall。在编写库时,我倾向于确保我的代码即使使用-Wextra. 它们可以帮助您捕获很多错误。