Giả sử tôi có một lớp học nơi các nhà xây dựng bản sao là tư nhân và không được thực hiện (để làm cho đối tượng không copyable)RVO có được phép khi một hàm tạo bản sao ở chế độ riêng tư và không được triển khai không?
class NonCopyable {
// whatever
private:
NonCopyable(const NonCopyable&);
void operator=(const NonCopyable&);
};
Bây giờ trong một số chức năng thành viên của lớp cùng tôi viết code mà trả về một đối tượng của lớp đó:.
NonCopyable NonCopyable::Something()
{
return NonCopyable();
}
mà là một trường hợp khi RVO thể kick trong
RVO vẫn đòi hỏi một constructor sao chép có thể truy cập. Kể từ khi có thể gọi đến hàm tạo bản sao được thực hiện từ bên trong cùng một hàm thành viên lớp, hàm tạo bản sao có thể truy cập. Vì vậy, về mặt kỹ thuật RVO là có thể mặc dù thực tế rằng mục đích là để cấm sử dụng các nhà xây dựng bản sao.
Được phép sử dụng RVO trong những trường hợp như vậy?
Hoặc đơn giản bằng cách sử dụng các tiện ích C++ 11 'delete' để phân biệt rõ ràng ngay tại giai đoạn biên dịch (thay vì giai đoạn liên kết) mà lớp đó sẽ không được sao chép. –
@Matthieu: Vâng, đó là một cơ chế tốt hơn nếu bạn không phải lo lắng về các trình biên dịch kế thừa (tôi đoán chúng ta có thể gọi chúng là di sản, ngay cả khi tôi chắc chắn rằng chúng vẫn có sự thống trị lớn trong cách sử dụng). –