2012-04-18 59 views
8

Đ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?

+0

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). –

+0

BTW, gcc 4.6.1 không gọi là bản sao hoặc di chuyển ctor. –

+0

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. –

Trả lời

8

Thật không may, VS11 không cung cấp hàm khởi động mặc định. Xem Move Semantics trong phần Nhận xét - để báo giá:

Không giống như hàm tạo bản sao mặc định, trình biên dịch không cung cấp hàm khởi tạo mặc định .

+0

Rất vui, cảm ơn! Bằng cách nào đó được cho phép bởi tiêu chuẩn? Nếu không, tôi đoán tôi sẽ mở một lỗi trên Microsoft Connect, mặc dù họ phải nhận thức rõ về nó. – Trillian

+0

MS chưa hoàn tất việc triển khai tất cả các tính năng C++ 11 mới. Có thêm thông tin tại http://msdn.microsoft.com/en-us/library/hh409293%28v=vs.110%29.aspx và http://blogs.msdn.com/b/vcblog/archive/2011/ 09/12/10209291.aspx – Fraser

+0

Chết tiệt, chúng tôi thậm chí không nhận được bản dựng khởi tạo mặc định cho phiên bản VS11 cuối cùng: / – Trillian

Các vấn đề liên quan