2013-06-01 47 views
9

Tại sao không có gì được in trong ví dụ này? Tôi đang biên dịch ở Clang trên Coliru.Tại sao di chuyển-nhà xây dựng không được gọi?

#include <iostream> 

struct S 
{ 
    S() noexcept = default; 
    S(S&&) noexcept { std::cout << "move-ctor"; } 
}; 

void f(S) {} 

int main() 
{ 
    f(S{}); 
} 
+0

có thể trùng lặp của [C++ 11 di chuyển constructor không được gọi, mặc định constructor ưa thích] (http://stackoverflow.com/questions/13099603/c11-move-constructor-not-called-default-constructor-preferred) – jogojapan

Trả lời

10

Trình biên dịch được thực hiện bản sao sự bỏ bớt, được phép cho mỗi đoạn 12,8/31 của C++ 11 tiêu chuẩn ngay cả khi nhà xây dựng di chuyển của bạn, copy constructor, hoặc destructor có tác dụng phụ:

Khi đáp ứng các tiêu chí nhất định, việc thực hiện được phép bỏ qua việc sao chép/di chuyển đối tượng của đối tượng lớp , ngay cả khi hàm tạo được chọn cho hoạt động sao chép/di chuyển và/hoặc hủy đối tượng có các tác dụng phụ.

Thuật ngữ bản sao sự bỏ bớt được sử dụng ngay cả khi một động thái đã được elided:

sự bỏ bớt này hoạt động sao chép/di chuyển, gọi bản sao sự bỏ bớt, được phép trong các trường hợp sau đây (có thể kết hợp để loại bỏ nhiều bản sao):

[...]

- khi một đối tượng lớp tạm thời không bị ràng buộc với tham chiếu (12.2) sẽ được sao chép/di chuyển đến một đối tượng lớp có cùng loại cv không đủ điều kiện, hoạt động sao chép/di chuyển có thể bị bỏ qua. đối tượng trực tiếp vào mục tiêu của bản sao bỏ qua/di chuyển

[...]

với GCC, bạn có thể sử dụng -fno-elide-constructors để ức chế sao chép sự bỏ bớt. Trong trường hợp này, bạn sẽ thấy rằng hàm tạo di chuyển được gọi, như trong live example này.

+0

Tại sao nó được gọi là sao chép elision nếu tôi đang di chuyển? – user2030677

+1

@ user2030677: Đó là thuật ngữ chuẩn. Chủ yếu vì lý do lịch sử (trong C++ 03 chỉ có bản sao có thể được elided, kể từ khi di chuyển ngữ nghĩa không tồn tại) –

+0

@ user2030677 bạn đang eliding một * bản sao *, mà có thể đã được thực hiện với các nhà xây dựng bản sao. – juanchopanza

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