Hãy xem xét các đối tượng:Const đúng đắn với các đối tượng có chứa shared_ptr
class Obj
{
public:
Obj() : val(new int(1)) {}
int& get() {return *val;}
const int& get() const {return *val;}
private:
std::shared_ptr<int> val;
};
Đúng như dự đoán, khi đối tượng được xây dựng và bản sao được thực hiện tất cả họ đều có thể thay đổi giá trị tương tự thông qua việc tiếp xúc với shared_ptr bởi obj.
Obj nonconst1;
Obj nonconst2(nonconst1);
nonconst2.get() = 2;
cout << nonconst1.get() << ", " << nonconst2.get() << endl;
Nó cũng có thể sao chép-xây dựng một đối tượng const Obj
từ một trong những phi const, mà dường như để làm điều đúng ở chỗ nó cho phép đọc nhưng không phải bằng văn bản cho giá trị - như mong đợi kết quả mã sau vào lỗi biên dịch:
const Obj const1(nonconst1);
const1.get() = 3;
Tuy nhiên, có thể sao chép không tạo thành Obj từ const, sau đó cho phép sửa đổi giá trị.
Obj nonconst3(const1);
nonconst3.get() = 3;
Đối với tôi điều này không cảm thấy chính xác.
Có cách nào để ngăn chặn hành vi này, trong khi vẫn cho phép trình tạo bản sao hoạt động không? Trong trường hợp sử dụng thực sự của tôi, tôi vẫn muốn container std của Obj là có thể.
Có thể, bạn nên xác định trình tạo bản sao tham chiếu không tham chiếu để tránh sao chép các đối tượng 'const'? – Nawaz
@Nawaz, hoạt động (tôi đã không nhận ra rằng nó có thể sử dụng một ref không-const trong một hàm tạo bản sao). Thật không may tôi cũng muốn const Obj để có thể sao chép xây dựng khác const obj nhưng cố gắng 'Obj (const Obj & o) const' không biên dịch – tangobravo