Trong C++ người ta không thể dựa vào constructor sao chép được gọi từ câu lệnh return vì một mệnh đề đặc biệt trong tiêu chuẩn cho phép trình biên dịch bỏ qua một lời gọi đến hàm tạo bản sao. câu lệnh return, ngay cả khi hàm tạo bản sao có các tác dụng phụ. Vì vậy, nó là phong cách xấu để viết một constructor sao chép mà làm cái gì khác hơn là chỉ cần sao chép xây dựng dụ. Có các câu lệnh tương tự trong tiêu chuẩn C++ 11 cho phép trình biên dịch loại bỏ một cuộc gọi đến nhà xây dựng di chuyển trong một số trường hợp nhất định - và nếu có, thì những trường hợp đó là gì?C++ 11 di chuyển constructor với các hiệu ứng phụ
Trả lời
Bản sao chỉ áp dụng như nhau để di chuyển xây dựng, đó là cùng một mệnh đề chính xác và cả việc cắt bỏ bản sao và xây dựng di chuyển được gọi chung là "copy-elision".
§12.8 [class.copy] p31
Khi tiêu chí nhất định được đáp ứng, một thực hiện được phép bỏ qua việc xây dựng bản sao/di chuyển của một đối tượng lớp, ngay cả khi các nhà xây dựng bản sao/di chuyển và/hoặc destructor cho đối tượng có tác dụng phụ. [...]
Khi cho phép sao chép bản sao, sẽ không có sao chép nào được thực hiện, vì vậy sẽ không có cuộc gọi đến hàm khởi động sao chép, ngay cả khi đối tượng có thể di chuyển được. Vì vậy, sao chép elision thắng hơn di chuyển, và bạn không thể chắc chắn (ít nhất là không phải trong một cách di động) khi nó sẽ diễn ra. Vì vậy, đây là một kịch bản khi tác dụng phụ trên xây dựng bản sao di chuyển sẽ là một ý tưởng tồi.
Elision được xác định giống hệt nhau cho cả bản sao và di chuyển. Tiêu chuẩn không có bất kỳ từ ngữ cụ thể nào để di chuyển, vì chúng được định nghĩa giống nhau.
- 1. C++ 11 constructor di chuyển không được gọi là, constructor mặc định ưu tiên
- 2. di chuyển đến C++ 11
- 3. tại sao emplace_back cần di chuyển constructor
- 4. Rõ ràng mặc định constructor di chuyển
- 5. C++ 11 constructor ảo sao chép
- 6. Getter với hiệu ứng phụ
- 7. Nên std :: mảng có di chuyển constructor?
- 8. Hiệu ứng di chuột qua/di chuyển chậm trên IE8
- 9. C++ 11 Tham chiếu Const VS di chuyển ngữ nghĩa
- 10. hiệu quả chuỗi constructor
- 11. Setter DI so với Constructor DI trong mùa xuân?
- 12. ảo baseclass gọi constructor rỗng trong C++ (C++ 11)
- 13. Hiệu suất của các chủ đề trong C++ 11
- 14. Thực hiện Di chuyển Constructor bằng cách gọi Di chuyển Nhà điều hành Chuyển nhượng
- 15. Đóng cửa Python với các hiệu ứng phụ
- 16. C++ loại tẩy xoá với bản sao mẫu và di chuyển constructor
- 17. Làm cách nào để lấy g ++ để biên dịch mã C++ 11 với một hàm tạo di chuyển?
- 18. quá tải nhập nhằng cho 'operator =' với C++ 11 std :: di chuyển và sao chép và hoán đổi thành ngữ
- 19. C++ 11: Universal thi hành di chúc
- 20. Hiệu ứng trượt có thể di chuyển JQuery-Mobile
- 21. C# Các hiệu ứng đúc hiệu suất
- 22. typedef có hiệu ứng phụ khai báo chuyển tiếp?
- 23. C++ 11 Hiệu suất in Variadic
- 24. C++ "di chuyển từ" container
- 25. Di chuột qua hiệu ứng trong NSCollectionView
- 26. Tại sao giao diện constructor của std :: vector thay đổi với C++ 11?
- 27. Di chuyển với lambdas
- 28. lý do đằng sau C++ ngầm sao chép và di chuyển constructor?
- 29. Làm mới/Nạp lại hiệu ứng phụ với ASP.net?
- 30. Di chuyển các tập tin trong C#
Cảm ơn. Câu hỏi được trả lời đầy đủ. Đã học rất nhiều hôm nay! Đầu tiên (một vài giây) là @Xeo. Đó sẽ là câu trả lời đúng. Tất cả câu trả lời +1 – ritter