Con đường tôi nhìn thấy nó là nếu chúng ta đã có một số tài liệu tham khảo rvalue x:
T&& x = ...;
và chúng tôi gọi một số chức năng sử dụng x như một tham số:
f(x)
Chúng ta cần cách nọ cách kia để nói với f có hay không nó có thể làm hỏng x (hoặc "sở hữu x" hoặc "là khách hàng cuối cùng sử dụng x").
Một cách để thiết kế này sẽ được hội đủ điều kiện mỗi cuộc gọi:
f(yours_now(x)) // ok to damage
f(still_mine(x)) // dont damage
và thực hiện cuộc gọi không đủ điều kiện bất hợp pháp.
Một cách khác sẽ được thực hiện một cách mặc định:
Hoặc:
f(yours_now(x)) // ok to damage
f(x) // dont damage
hoặc
f(x) // ok to damage
f(still_mine(x)) // dont damage
Vì vậy, nếu chúng ta đồng ý đủ điều kiện mỗi lần sử dụng là quá cồng kềnh và chúng ta nên mặc định theo một cách, tốt nhất là gì? Vâng, hãy xem xét chi phí vô tình chọn mặc định trong cả hai trường hợp:
Trong trường hợp đầu tiên, bạn có thể bị hỏng, nhưng chúng tôi vô tình cho rằng không phải vậy. Trong trường hợp này chúng tôi mất hiệu suất vì một bản sao không cần thiết đã được thực hiện, nhưng khác hơn là không có việc lớn.
Trong trường hợp thứ hai không thể làm hỏng đối tượng, nhưng chúng tôi vô tình cho biết.Điều này có thể gây khó khăn trong việc phát hiện lỗi logic trong chương trình, vì x hiện đang ở trạng thái bị hỏng khi trả về f, nhưng tác giả mong đợi nó không được.
Vì vậy, trường hợp đầu tiên là những gì được chọn vì nó "an toàn hơn".