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.
Nguồn
2013-06-01 12:37:48
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