Tôi có một số hành vi kỳ lạ trên std :: vector với rvalues thêm:С ++ 11 vector làm bản sao trên rvalue
#include <iostream>
#include <vector>
class A {
public:
A():i_{5}{std::cout << "default" << std::endl;}
A(const A &data) { std::cout << "copied!" << std::endl; }
A(A &&data) { std::cout << "moved " << std::endl; }
int i_;
};
int main(int argc, char *argv[]) {
std::vector<A> datavec;
datavec.push_back(A{});
datavec.push_back(A{});
return 0;
}
đầu ra là:
default
moved
default
moved
copied!
Vì vậy, vector vẫn tạo ra các bản sao của A , tôi càng đẩy nhiều - tôi càng nhận được nhiều bản sao hơn. Tuy nhiên, nếu tôi thay thế hàm khởi tạo bằng mặc định A (A & & dữ liệu) = mặc định; hoặc xóa hàm tạo bản sao với A (const A & dữ liệu) = xóa; Tôi nhận được kết quả đúng khi không có bản sao nào được thực hiện. Tôi cũng không có bản sao nếu lần đầu tiên tôi gọi datavec.reserve với đủ kích thước. tôi sử dụng gcc phiên bản 5.4.0 không có đối số cụ thể
g++ -std=c++11 -o main ../main.cpp
Bạn đã có bất kỳ suy nghĩ về lý do tại sao vector làm cho các bản sao của rvalues rõ ràng? Tôi hy vọng nó không phải là một số lỗi của STL
Câu hỏi hay, câu trả lời hay và vị trí trùng lặp tuyệt vời. – Bathsheba