我的编译器对很多隐式转换让我感到温暖:
有些我确实理解,比如
implicit conversion changes signedness: 'int' to 'std::vector::size_type' (aka 'unsigned long')`
当我做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'
当我做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')
当我打电话给myString[myInt]
我所有情况下,我确实理解为什么我会收到这些消息(int-uint 等(,但是它们的使用在程序中是明确的。如果我不搜寻更改变量的类型以删除这些警告,我会有什么风险? 我以前的编译器没有警告我任何事情,所以当我更换电脑时,我突然收到了几十个警告。
我在所有情况下,我确实明白为什么我会收到这些消息(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
在这里,假设一个 32 位系统,i
在传递给operator[]
之前被转换为2147483651
,从而导致未定义的行为。
如果您真的确定转换是无害的,您可以做一个static_cast
:
static_cast<std::vector<int>::size_type>(i)
我以前的编译器没有警告我任何事情,所以当我更改我的 电脑我突然有几十个警告。
始终打开警告。至少做-Wall
. 在编写库时,我倾向于确保我的代码即使使用-Wextra
也能干净地编译。 他们可以帮助您捕获很多错误。
stl 的size_type归结为编译器的一个unsigned long
。这会在将其分配给有符号类型(如int
(时发出implicit conversion changes signedness
警告。
此外,long
的宽度取决于 CPU 架构,即 x86 上的 32 位,x64 上的 64 位,而int
定义为 32 位宽度。这将发出implicit conversion loses integer precision
警告。
我以前的编译器没有警告我任何事情,所以当我更改我的 电脑我突然有几十个警告
新PC上的警告级别可能更高。检查-W3
(Windows(、-Wall
或-Wextra
(GCC( 的编译器选项。
如果我不狩猎,我会冒什么风险,将变量的类型更改为 删除这些警告?
它至少是糟糕的风格,如果 stl 容器的大小不适合 int,则会导致未定义的行为。