Xét đoạn mã sau:Tại sao các nhà xây dựng sao chép và di chuyển được gọi cùng nhau?
#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;
}
Đầu ra là:
int
int
int
copy
copy
copy
A(10)
, A(20)
và A(30)
là temporaries, phải không?
Vậy tại sao trình tạo bản sao lại được gọi? Không nên gọi hàm khởi động thay vào đó?
Đi qua move(A(10))
, move(A(20))
, move(A(30))
thay vào đó, đầu ra là:
int
move
int
move
int
move
copy
copy
copy
Trong trường hợp này hoặc sao chép hoặc di chuyển constructor được gọi.
Điều gì đang xảy ra?
Bạn không thể di chuyển từ các phần tử 'initializer_list'. 'Di chuyển' bổ sung trong ví dụ thứ hai của bạn ngăn cản việc sao chép bản sao và vì vậy bạn sẽ có thêm một bước di chuyển trên đầu trang của bản sao. –
Câu hỏi hay; câu trả lời được chôn ở đây: http://en.cppreference.com/w/cpp/language/list_initialization – Bathsheba
Bên trong một hàm tạo có 'std :: initializer_list' trong' std :: vector', những phần tử đó không còn là giá trị . –