考虑到auto
的以下用法:
std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
...
}
C ++最好将i
推导为std::vector<int>::size_type
,但如果它仅查看i
的初始值设定项,则会看到一个整数。在这种情况下,i
的推导类型是什么?这是auto
的适当用法吗?
答案 0 :(得分:20)
使用decltype
代替auto
来声明i
。
for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
// ...
}
更好的是,使用迭代器迭代向量,如@MarkB的答案所示。
答案 1 :(得分:13)
为什么不用迭代器解决你的问题?然后问题就消失了:
std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
...
}
如果你想使用索引进行迭代,我可能只是明确地说明了这个类型:你知道它是什么。 auto
主要用于我认为的未知或难以输入的模板类型。
答案 2 :(得分:7)
您的问题的答案“这是否适用于汽车?”不是出于其他答案中解释的原因。对于循环容器内容的特殊情况,最好使用基于for循环的范围:
对元素的const引用访问,i
为const int&
:
std::vector<int> v;
for (const auto& i : v ) {
std::cout << i << "\n";
}
非const引用访问权限,i
为int&
:
std::vector<int> v;
for (auto& i : v ) {
++i;
std::cout << i << "\n";
}
价值访问权限,i
为int
:
std::vector<int> v;
for (auto i : v ) {
...
}
等等。这也适用于C风格的数组。
答案 3 :(得分:3)
auto
仅从初始化程序获取类型。没有注意其他用途,至少不用于确定变量的类型。考虑到这一点,decltype
是一个选项:
for (decltype(v.size()) i = 0; i < v.size(); ++i)
或者,您可以重写循环以向后退:
for (auto i = v.size(); i-- != 0; )
或者,您可以完全避免for
循环。