#include <vector>
#include <iostream>
int main()
{
std::vector< int > v = { 1, 2, 3 };
for ( auto it : v )
{
std::cout<<it<<std::endl;
}
}
auto
扩展到什么地方?它是否会扩展到int&
或int
?
答案 0 :(得分:18)
它扩展为int。如果您想要参考,可以使用
for ( auto& it : v )
{
std::cout<<it<<std::endl;
}
根据C ++ 11标准,auto
计为简单类型说明符 [7.1.6.2],因此相同的规则适用于其他简单型说明符。这意味着使用auto
声明引用与其他任何内容都没有区别。
答案 1 :(得分:5)
我创建了另一个例子,它回答了这个问题:
#include <vector>
#include <iostream>
struct a
{
a() { std::cout<<"constructor" << std::endl; }
a(const a&) { std::cout<<"copy constructor" << std::endl; }
a(a&&) { std::cout<<"move constructor" << std::endl; }
operator int(){return 0;}
};
int main()
{
std::vector< a > v = { a(), a(), a() };
std::cout<<"loop start" << std::endl;
for ( auto it : v )
{
std::cout<< static_cast<int>(it)<<std::endl;
}
std::cout<<"loop end" << std::endl;
}
显而易见,auto
扩展为int
,并且正在制作副本。为防止复制,for循环必须带有引用:
for ( auto & it : v )