我在执行以下代码时遇到了这个问题:
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
在int
上没有vi.size()
强制转换,输出是垃圾,因为size()
返回无符号整数。
如果我没有用Google搜索向量参考,我就不会想到这一点。有没有办法避免这个陷阱?对于-Wall
和-pedantic
,gcc似乎没有对这种划分发出任何警告。
答案 0 :(得分:4)
gcc
有-Wconversion
标志,在这种情况下警告我:
warning: conversion to ‘int’ from ‘std::vector<int>::size_type {aka long unsigned int}’ may alter its value [-Wconversion]
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
^
gcc docs说:
-Wconversion
警告可能会改变值的隐式转换。这包括实数和整数之间的转换,如x为double时的abs(x);有符号和无符号之间的转换,如无符号ui = -1;和转换为较小的类型,如sqrtf(M_PI)。不要警告显式转换,如abs((int)x)和ui =(unsigned)-1,或者如果转换没有像abs(2.0)那样改变值。可以使用-Wno-sign-conversion禁用有关有符号和无符号整数之间转换的警告。
对于C ++,还要警告用户定义的转换会导致过载分辨率混乱;和从不使用类型转换运算符的转换:转换为void,相同类型,基类或对它们的引用。默认情况下,在C ++中禁用有符号和无符号整数之间转换的警告,除非明确启用了-Wsign-conversion。