#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?
Ответ 1
Он расширяется до int. Если вы хотите ссылку, вы можете использовать
for ( auto& it : v )
{
std::cout<<it<<std::endl;
}
В соответствии со стандартом С++ 11 auto считается спецификатором простого типа [7.1.6.2], поэтому к нему применяются те же правила, что и для других спецификаторов простого типа. Это означает, что объявление ссылок с помощью auto ничем не отличается от других.
Ответ 2
Я создал еще один пример, который отвечает на вопрос:
#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 должен иметь ссылку: