考慮下面的代碼:爲什麼複製和移動構造函數一起調用?
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A(int) { cout << "int" << endl; }
A(A&&) { cout << "move" << endl; }
A(const A&) { cout << "copy" << endl; }
};
int main()
{
vector<A> v
{
A(10), A(20), A(30)
};
_getch();
return 0;
}
輸出是:
int
int
int
copy
copy
copy
A(10)
,A(20)
和A(30)
是臨時工吧?
那麼爲什麼複製構造函數被調用?不應該調用移動構造函數嗎?
傳遞move(A(10))
,move(A(20))
,move(A(30))
代替,輸出爲:
int
move
int
move
int
move
copy
copy
copy
在這種情況下,或者複製或移動構造函數被調用。
發生了什麼事?
你不能從'initializer_list'元素移動。第二個示例中的附加「移動」禁止複製,因此您可以在複製之上獲得額外的移動。 –
好問題;答案埋在這裏:http://en.cppreference.com/w/cpp/language/list_initialization – Bathsheba
在一個構造函數中,需要'std :: vector'中的'std :: initializer_list',那些元素不再是右值。 –