C++ C++;11自动尺寸和U型

C++ C++;11自动尺寸和U型,c++,c++11,auto,C++,C++11,Auto,给出了auto的以下用法: std::vector<int> v; for (auto i = 0; i < v.size(); ++i) { ... } std::vector v; 用于(自动i=0;i C++是理想的推导 i>代码> AS代码> STD::vector:sisiz类型< /C> >,但是如果只查看 I/C> >的初始化器,它将看到一个整数。在这种情况下,i的推断类型是什么?这是否适合使用auto?为什么不解决迭代器的问题?然后问题就消失了: std

给出了
auto
的以下用法:

std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
   ...
}
std::vector v;
用于(自动i=0;i

< > C++是理想的推导<代码> i>代码> AS代码> STD::vector:sisiz类型< /C> >,但是如果只查看<代码> I/C> >的初始化器,它将看到一个整数。在这种情况下,
i
的推断类型是什么?这是否适合使用
auto

为什么不解决迭代器的问题?然后问题就消失了:

std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
   ...
}
std::vector v;
对于(自动i=v.begin();i!=v.end();++i){
...
}

如果您想使用索引进行迭代,我可能只需要显式地说明类型:您知道它是什么<代码>自动
主要用于未知或难以键入的模板类型。

自动
仅从初始值设定项获取类型。不注意其他用途,至少不用于确定变量的类型。考虑到这一点,
decltype
是一个选项:

for (decltype(v.size()) i = 0; i < v.size(); ++i)

或者,您可以完全避免
for
循环。

使用
decltype
而不是
auto
来声明
i

for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
  // ...
}
for(decltype(v.size())i=0;i

更好的方法是,使用迭代器对向量进行迭代,如@MarkB的答案所示。

对于您的问题“这是自动的适当用法吗?”的答案是否定的,原因在其他答案中解释。对于在容器内容中循环的特定情况,最好使用基于范围的For循环:

对元素的常量引用访问,
i
const int&

std::vector<int> v;
for (const auto& i :  v ) {
   std::cout << i << "\n";
}
std::vector<int> v;
for (auto& i :  v ) {
   ++i;
   std::cout << i << "\n";
}
值访问,
i
int

std::vector<int> v;
for (auto i :  v ) {
   ...
}
std::vector v;
用于(自动i:v){
...
}

等等。这也适用于C型数组。

如果不知道如何使用
i
就无法判断。我从来不知道
auto
用于推断适当类型的变量!是吗?@TAMER先生是的,他们在C++11中更改了它的含义。@MarkB:太好了!!现在它类似于C#中的
var
,对吗?您还可以提到标准中定义新含义的部分吗?@Mr.TAMER[dcl.spec.auto],是的,它与C#的
var
关键字几乎完全相同。或者更好,使用基于范围的for循环,如下面的回答所示。它应该是begin(v)和end(v)
std::vector<int> v;
for (auto i :  v ) {
   ...
}