Tại sao có hàm khởi tạo di chuyển hoặc toán tử gán mặc định không được tạo cho các lớp dẫn xuất? Để chứng minh những gì tôi có ý nghĩa; có mã thiết lập này:Di chuyển hàm tạo và toán tử gán: tại sao không mặc định cho các lớp dẫn xuất?
#include <utility>
struct A
{
A() { }
A (A&&) { throw 0; }
A& operator= (A&&) { throw 0; }
};
struct B : A
{ };
một trong những dòng sau ném:
A x (std::move (A());
A x; x = A();
nhưng không phải điều nào sau đây không:
B x (std::move (B());
B x; x = B();
Trong trường hợp vấn đề, tôi đã thử nghiệm với GCC 4.4 .
EDIT: Thử nghiệm sau với GCC 4.5 cho thấy cùng một hành vi.
Liệu 'std :: move' có thay đổi gì ở đây không? Không phải là 'A() 'đã là một giá trị? –
Vâng, đúng vậy. Nếu không, tiêu chuẩn C++ cho phép trình biên dịch nén thành chỉ-xây dựng-x (hoặc vì vậy tôi đã nói trên freenode.net). Tôi cũng đã xác minh rằng không có 'std :: move', hàm tạo di chuyển không phải là trigerred, vì vậy nhận xét của freenode.net có vẻ đúng. – doublep
@Mike: Sao chép elision (12.8/34, 0x FCD) là một tối ưu hóa phổ biến, nhưng bằng cách sử dụng move() làm cho biểu thức này nằm ngoài các trường hợp cho phép. –