2016-01-05 32 views
5

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?

+0

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

+2

'std :: vector :: toán tử []' trả về tham chiếu. 'std :: vector :: toán tử [] const' trả về tham chiếu const. –

+0

@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

Trả lời

0

Để làm rõ, có vẻ như cần phải có vùng chứa giống vectơ nơi const chỉ có nghĩa là người dùng không thể thay đổi kích thước vùng chứa, nhưng các yếu tố trong vùng chứa có thể thay đổi.

Đó là std::array. Bạn đặt kích thước tại thời gian biên dịch. Để thiết lập kích thước tại thời gian xây dựng có đề xuất dynarray.

+0

Điều đó có vẻ hợp lý đối với véc tơ, nhưng còn các container STL khác thì sao? Có vẻ hợp lý để có một cái gì đó như std :: bản đồ nơi bạn không thể thêm hoặc loại bỏ các khóa, nhưng các giá trị có thể thay đổi. – pelletjl

+0

Tiêu chuẩn là thư viện không phải là tập hợp tất cả những thứ có thể. –

+0

Vì constness không hàm ý các giá trị đã biết tại thời gian biên dịch, tôi muốn so sánh các mảng/khung nhìn mới với các phần tử không thể thay đổi kích thước không thể thay đổi được. Nhưng vì một lý do mà tôi không biết, các khung nhìn đó có cùng hành vi như 'vector': Các hoạt động của chúng hoạt động như thể khung nhìn là các phần tử của nó -' operator == 'so sánh các phần tử và' const' sâu như trái ngược với con trỏ bọc. – dyp

Các vấn đề liên quan