Stworzyłem inny przykład, który odpowiada na pytanie:
#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;
}
Jest oczywiste, że auto
rozszerza się int
, a kopia jest dokonywana. Aby zapobiec kopiowaniu, pętla for musi mieć odniesienie:
for (auto & it : v)
Historycznie słowo kluczowe auto było typem pamięci typu specyfikator wskazujący obiekt, który ma automatyczny typ przechowywania (tj. Przydzielony na stosie). – Oyeme
@Oyeme: Pewnie. Ale jak to jest związane z pytaniem? – ereOn
@Oyeme: W C++ 11, 'auto' oznacza coś zupełnie nowego. –