Không có sự khác biệt giữa hai phương pháp này và bạn nên sử dụng phương pháp giao tiếp tốt nhất ý định của mình cho bạn.
Đoạn 12,8/31 trên bản sao sự bỏ bớt quy định cụ thể:
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 sao chép/di chuyển của một đối tượng lớp , ngay cả khi các nhà xây dựng được lựa chọn cho hoạt động sao chép/di chuyển và/hoặc destructor cho đối tượng có các tác dụng phụ. Trong trường hợp này, việc triển khai xử lý nguồn và đích của thao tác sao chép/di chuyển bị bỏ qua chỉ đơn giản là hai cách khác nhau đề cập đến cùng một đối tượng và việc hủy bỏ đối tượng đó xảy ra vào cuối thời gian khi hai đối tượng đã bị phá hủy mà không cần tối ưu hóa. sự bỏ bớt này hoạt động sao chép/di chuyển, được gọi là bản sao sự bỏ bớt, được cho phép trong các trường hợp sau (mà có thể được kết hợp để loại bỏ nhiều bản sao):
- trong một tuyên bố return
trong một hàm với một kiểu lớp trở lại , khi biểu thức là tên của đối tượng tự động không bay hơi (khác với hàm hoặc tham số mệnh đề bắt buộc) với cùng loại cn-unqualified làm kiểu trả về hàm, có thể bỏ qua thao tác sao chép/di chuyển bằng cách xây dựng đối tượng tự động trực tiếp vào giá trị trả về của hàm
- [...]
Như bạn có thể thấy, cả việc tạo ra một tạm thời và một id-biểu đặt tên một đối tượng địa phương với thời hạn lưu trữ tự động đủ điều kiện để sao chép sự bỏ bớt.
Hơn nữa, trình biên dịch sẽ xử lý địa phương temp
như số rvalue (đọc: như tạm thời, trong trường hợp này) cho mục đích trả lại từ một hàm. Đoạn 12,8/32 của C++ 11 tiêu chuẩn quy định cụ thể:
Khi các tiêu chuẩn cho sự bỏ bớt một hoạt động sao chép được đáp ứng hoặc sẽ được đáp ứng tiết kiệm cho một thực tế rằng các đối tượng nguồn là một tham số chức năng, và các đối tượng được sao chép được chỉ định bởi một giá trị, độ phân giải quá tải đến chọn hàm tạo cho bản sao được thực hiện lần đầu tiên như thể đối tượng được chỉ định bởi giá trị. [...]
Bởi vì điều này, tôi sẽ đề nghị mạnh mẽ loại bỏ trình độ const
từ kiểu trả về:
const X operator + (const X& left, const X&right)
// ^^^^^
// Don't use this!
Trong C++ 11, điều này sẽ ức chế ngữ nghĩa di chuyển, bởi vì bạn không thể di chuyển từ một đối tượng const
, ngay cả khi nó là một giá trị - trong ngắn hạn, hàm khởi động di chuyển của X
, cung cấp một tồn tại, sẽ không được chọn và hàm tạo bản sao sẽ được gọi.
Trong C++ 11, 'return {left.i + right.i}' là phương thứC# 3 mà ... cũng làm điều tương tự (sau khi tối ưu hóa tầm thường). – Yakk