我得到以下代码的已签名/未签名不匹配警告:
auto n = a.size();
for (auto i = 0; i < n; i++) {
}问题是,通过将0赋值给i,它变成了int而不是size_t。那么哪个更好呢:
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}或者这样:
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}或者你有更好的解决方案?我更喜欢第一个,因为它更一致一些,它只是使用size_t而不是size_t和auto来实现相同的目的。
发布于 2013-07-07 01:08:18
基于范围的循环可能是一个更干净的解决方案:
for (const auto& i : a)
{
}这里,i是对容器a的元素的const引用。
否则,如果需要索引,或者不想遍历整个范围,可以使用decltype(a.size())获取类型。
for (decltype(a.size()) i = 0; i < a.size(); ++i) {
}发布于 2013-07-07 01:18:02
根据您希望在循环中执行的操作和编译器的功能,基于范围的for循环可能是更好的解决方案。
你提出的所有解决方案在大多数情况下都是不错的,只有很小的不同,你的第一个解决方案实际上是更糟糕的选择,这正是你的编译器告诉你的。第二种解决方案更好,但如果您希望避免直接定义类型以简化或进行一些将来的更改,则可以执行以下操作:
auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}通过这种方式,您可以将i和n类型绑定为始终相互匹配。
发布于 2013-07-07 01:26:32
如果你使用了正确的字面量,你就会很好: 0U。auto看到的是int类型的文本,所以这是i的类型。加上U,它将看到一个无符号的int文本。否则,你应该像其他人建议的那样使用decltype,特别是因为sizeof(size_t)可能大于sizeof(int) (如果在64位长模式下运行,它在Windows、OS等平台上)。
https://stackoverflow.com/questions/17505164
复制相似问题