杀死无符号/有符号比较错误

4

一般来说,我想要有未签名和已签名的警告。

然而,在这种特殊情况下,我希望它被抑制;

std::vector<Blah> blahs;

for(int i = 0; i < blahs.size(); ++i) { ...

我想消除这个比较。

谢谢!

(使用g++)

1个回答

12
你应该修复而不是抑制。使用无符号类型:
for (size_t i = 0; i < blahs.size(); ++i)

你也可以使用unsigned,但在这里更适合使用size_t(并且可能具有不同的、更大的范围)。如果你只是用i来迭代,并且不需要在循环中使用它的值,请改用迭代器:

for (auto iter = blahs.begin(), end = blahs.end(); iter != end; ++iter)

如果您的编译器不支持auto,请将auto替换为T::iteratorT::const_iterator,其中Tblahs的类型。但如果您的编译器支持更完整的C++11子集,则可以这样做:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接