Đoạn mã sau sẽ khiến cho các nhà xây dựng bản sao được gọi là nơi tôi mong đợi các nhà xây dựng di chuyển được gọi là:Tại sao hàm tạo bản sao này được gọi thay vì hàm tạo di chuyển?
#include <cstdio>
struct Foo
{
Foo() { puts("Foo gets built!"); }
Foo(const Foo& foo) { puts("Foo gets copied!"); }
Foo(Foo&& foo) { puts("Foo gets moved!"); }
};
struct Bar { Foo foo; };
Bar Meow() { Bar bar; return bar; }
int main() { Bar bar(Meow()); }
On VS11 Beta, trong chế độ gỡ lỗi, bản in này:
Foo gets built!
Foo gets copied!
Foo gets copied!
Tôi đã kiểm tra tiêu chuẩn và Bar
dường như đáp ứng tất cả các yêu cầu để có một hàm tạo di chuyển mặc định được tạo tự động, nhưng điều đó dường như không xảy ra trừ khi có một lý do khác khiến đối tượng không thể di chuyển được. Tôi đã nhìn thấy rất nhiều di chuyển và sao chép các câu hỏi liên quan đến xây dựng xung quanh ở đây nhưng tôi không nghĩ rằng bất cứ ai đã có vấn đề cụ thể này.
Mọi gợi ý về những gì đang xảy ra ở đây? Đây có phải là hành vi tiêu chuẩn này không?
Có 'return std :: move (bar);' thay đổi gì không? BTW, gcc 4.7.0 gọi hàm khởi tạo di chuyển (với việc bỏ qua sao chép bản sao). –
BTW, gcc 4.6.1 không gọi là bản sao hoặc di chuyển ctor. –
g ++ 4.5.3 chỉ tạo đối tượng: "Foo được xây dựng!" (sao chép elision), trong khi với elision sao chép vô hiệu hóa nó sao chép đối tượng hai lần. Không phải là một nhà xây dựng di chuyển chỉ được gọi khi bạn có một rvalue? Tôi không hoàn toàn chắc chắn Meow() đủ điều kiện. –