Sau nhiều năm chấp nhận một cách mù quáng một thực tế rằng std::vector<T>::operator[] const
trả về const_reference
, nhưng, theo cách const hoạt động cho con trỏ thông minh, tôi bắt đầu tự hỏi tại sao nó và phần còn lại của các container STL được thiết kế đường. Dường như "độ chói" của const std::vector
đang được áp dụng cho cả vectơ và các phần tử của nó, trong khi đối với con trỏ thông minh thì "constness" chỉ áp dụng cho con trỏ chứ không áp dụng cho phần tử trỏ tới. Để làm rõ, có vẻ như phải có một thùng chứa giống như vectơ nơi const
chỉ có nghĩa là người dùng không thể thay đổi kích thước của vùng chứa, nhưng các yếu tố trong vùng chứa có thể thay đổi. Câu hỏi chính của tôi là: Có cái gì đó có thể ngăn chặn loại container này trở thành "const đúng" không?const chính xác cho các thùng chứa
Dường như có một vài cách giải quyết hackish bằng cách thêm thêm một lớp gián tiếp (ví dụ std::vector<std::unique_ptr<T>> const
) để thực hiện điều này, nhưng tôi đang tìm một cái gì đó một chút ít vụng về bảo trì.
Là một sang một bên, nếu con trỏ thông minh đã được đưa vào ngôn ngữ trước khi STL container, sẽ accessors const vẫn đã được xác định theo cách mà họ có ngày hôm nay?
Bạn có thể xác định lớp của riêng bạn mà sử dụng thành phần hành động indirecly trên một 'có thể thay đổi std :: vector' và đảm bảo tính đúng đắn const (theo nghĩa của bạn) qua các chức năng thành viên cộng đồng. – oLen
'std :: vector :: toán tử []' trả về tham chiếu. 'std :: vector :: toán tử [] const' trả về tham chiếu const. –
@Marshall Clow Bằng cách nào đó rơi ra khỏi dự thảo ban đầu của tôi. Tôi sẽ thêm nó trở lại. Cảm ơn. – pelletjl