一般来说,我想要未签名与已签名的警告。
但是,在这种特殊情况下,我希望它被压制;
std::vector<Blah> blahs;
for(int i = 0; i < blahs.size(); ++i) { ...
我想扼杀这种比较。
谢谢!
(使用 g++)
一般来说,我想要未签名与已签名的警告。
但是,在这种特殊情况下,我希望它被压制;
std::vector<Blah> blahs;
for(int i = 0; i < blahs.size(); ++i) { ...
我想扼杀这种比较。
谢谢!
(使用 g++)
你应该修复,而不是压制。使用无符号类型:
for (size_t i = 0; i < blahs.size(); ++i)
您也可以使用unsigned
, 但size_t
在这里更合适(并且可能有不同的、更大的范围)。如果您仅i
用于迭代并且在循环中不需要其值,请改用迭代器:
for (auto iter = blahs.begin(), end = blahs.end(); iter != end; ++iter)
如果您的编译器不支持,请用orauto
替换,其中的类型是. 但是,如果您的编译器支持更完整的 C++11 子集,请执行以下操作:auto
T::iterator
T::const_iterator
T
blahs
for (auto& element : blahs)
这是最好的。
严格来说,上述内容并不“正确”。它应该是:
typedef std::vector<Blah> blah_vec;
blah_vec blahs;
for (blah_vec::size_type i = 0; i < blahs.size(); ++i)
但这可能很冗长,而且我知道的每个实现都照常size_t
使用size_type
。
如果由于某种原因你真的需要一个有符号整数类型i
,你将不得不强制转换:
// assumes size() will fit in an int
for (int i = 0; i < static_cast<int>(blahs.size()); ++i)
// assumes i will not be negative (so use an unsigned type!)
for (int i = 0; static_cast<size_t>(i) < blahs.size(); ++i)
// and the technically correct way, assuming i will not be negative
for (int i = 0; static_cast<blah_vec::size_type>(i) < blahs.size(); ++i)