Tôi có một loại mà tôi đã xóa các nhà xây dựng bản sao từ, và tôi muốn có một vector
loại này, vì vậy tôi cần phải tạo ra tất cả các yếu tố thông qua emplace_back
. Tuy nhiên, emplace_back
dường như yêu cầu một hàm tạo bản sao, vì trình biên dịch đưa ra một cảnh báo về việc không thể khởi tạo emplace_back
vì hàm tạo bản sao đã bị xóa. Tại sao nó cần một nhà xây dựng bản sao? Tôi nghĩ rằng toàn bộ điểm của emplace_back
là để xây dựng các vector
mà không cần sao chép bất cứ điều gì. Tôi có thể có một số vector
của các đối tượng không có hàm tạo bản sao không?Tại sao điều này không sử dụng emplace_back với công việc xây dựng bản sao đã bị xóa?
class MyType {
public:
MyType(std::array<double, 6> a) {}
MyType(const MyType& that) = delete;
};
int main() {
std::vector<MyType> v;
std::array<double, 6> a = {1,2,3,4,5,6};
v.emplace_back(a);
}
Trình biên dịch là clang/llvm.
http://cpp.sh/9v5w tại đây không hoạt động –
ở đây cũng http://goo.gl/eLUPjR –
'emplace_back' không cần hàm tạo bản sao nhưng khi dung lượng của vectơ không đủ để lưu trữ phần tử mới, vector cần phải phân bổ lại phần tử của nó, điều này đòi hỏi hàm tạo bản sao/di chuyển. Bằng cách xóa hàm tạo bản sao, bạn cũng ngăn chặn nó tạo ra hàm khởi tạo di chuyển mặc định. Trong trường hợp này, khai báo một hàm tạo di chuyển có thể làm việc – Danh