Gần đây tôi đã đọc (và không may quên ở đâu), rằng cách tốt nhất để viết operator = là như thế này:constructor sao chép rõ ràng hoặc tham số ngầm theo giá trị
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
thay vì điều này:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
Ý tưởng là nếu toán tử = được gọi với giá trị rvalue, phiên bản đầu tiên có thể tối ưu hóa việc xây dựng bản sao. Vì vậy, khi được gọi với một rvalue, phiên bản đầu tiên là nhanh hơn và khi được gọi với một lvalue hai là tương đương.
Tôi tò mò về những gì người khác nghĩ về điều này? Mọi người có nên tránh phiên bản đầu tiên vì thiếu nhân chứng không? Tôi có đúng là phiên bản đầu tiên có thể tốt hơn và không bao giờ có thể tồi tệ hơn không?
'Trao đổi' là gì? Nếu nó là 'foo temp = x; x = y; y = temp; 'bạn có sự đệ quy infinte của hàm' operator = 'và' swap'. –
Tôi đã viết một chương trình để kiểm tra lý thuyết của @Alexey Malistov và ông ấy đã đúng - tôi đã có đệ quy vô hạn. – nobar
Bất kỳ lớp nào thực hiện một bản sao và thành phần hoán đổi không thể dựa vào việc thực thi 'std :: swap' mặc định trong toán tử gán bản sao của nó. Điều đó khá nhiều mà không nói. –