首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用auto in loops c++

使用auto in loops c++
EN

Stack Overflow用户
提问于 2013-07-07 01:06:43
回答 8查看 22.3K关注 0票数 36

我得到以下代码的已签名/未签名不匹配警告:

代码语言:javascript
复制
auto n = a.size();
for (auto i = 0; i < n; i++) {
}

问题是,通过将0赋值给i,它变成了int而不是size_t。那么哪个更好呢:

代码语言:javascript
复制
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}

或者这样:

代码语言:javascript
复制
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}

或者你有更好的解决方案?我更喜欢第一个,因为它更一致一些,它只是使用size_t而不是size_tauto来实现相同的目的。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-07-07 01:08:18

基于范围的循环可能是一个更干净的解决方案:

代码语言:javascript
复制
for (const auto& i : a)
{

}

这里,i是对容器a的元素的const引用。

否则,如果需要索引,或者不想遍历整个范围,可以使用decltype(a.size())获取类型。

代码语言:javascript
复制
for (decltype(a.size()) i = 0; i < a.size(); ++i) {
}
票数 51
EN

Stack Overflow用户

发布于 2013-07-07 01:18:02

根据您希望在循环中执行的操作和编译器的功能,基于范围的for循环可能是更好的解决方案。

你提出的所有解决方案在大多数情况下都是不错的,只有很小的不同,你的第一个解决方案实际上是更糟糕的选择,这正是你的编译器告诉你的。第二种解决方案更好,但如果您希望避免直接定义类型以简化或进行一些将来的更改,则可以执行以下操作:

代码语言:javascript
复制
auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}

通过这种方式,您可以将in类型绑定为始终相互匹配。

票数 18
EN

Stack Overflow用户

发布于 2013-07-07 01:26:32

如果你使用了正确的字面量,你就会很好: 0U。auto看到的是int类型的文本,所以这是i的类型。加上U,它将看到一个无符号的int文本。否则,你应该像其他人建议的那样使用decltype,特别是因为sizeof(size_t)可能大于sizeof(int) (如果在64位长模式下运行,它在Windows、OS等平台上)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17505164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档