2012-12-07 38 views
5

thể trùng lặp:
Why does stack<const string> not compile in g++?vectơ <const int> không được phép. Tại sao cặp <const int, int> được cho phép?

An answer to another question giải thích tại sao chúng ta (được cho là) ​​không thể có container của const đối tượng. Ví dụ, điều này là không được phép:

vector<const int> v; //not allowed 

Nhưng tại sao một pair cho phép các đối tượng đầu tiên được const? Thực tế, điều này xảy ra với các đối tượng pair bên trong đối tượng map. Tui bỏ lỡ điều gì vậy?

Giải thích chi tiết và trực quan về hiện tượng này sẽ được đánh giá cao.

+0

'std :: pair' không chính xác là một vùng chứa, phải không? Bạn cũng được phép có 'const int'. –

Trả lời

14

Tôi nghĩ lý do chính tại sao là vì std::pair không phân bổ lại các đối tượng, vì vậy chúng không phải chuyển nhượng được.

Cập nhật:

Trên thực tế vector là container duy nhất mà đòi hỏi đối tượng được chuyển nhượng. Điều này là do phù hợp với vectơ chuẩn phải có vị trí lưu trữ liền kề cho các phần tử của nó. Vì vậy, nếu không có chỗ cho nhiều đối tượng cần thêm, vector sẽ phải phân bổ lại dữ liệu của nó đến một vị trí khác (do đó sử dụng thuộc tính có thể gán của các đối tượng).

+1

Cảm ơn. Nhân tiện, lý do cho nỗi ám ảnh 'const' của tôi là để tôi không vô tình sửa đổi những thứ mà tôi không có kế hoạch sửa đổi ngay từ đầu. Trong trường hợp này, tôi không muốn sửa đổi các phần tử vùng chứa, chỉ thêm vào vùng chứa. Có lẽ tôi nên bắt đầu sử dụng 'deque' thay vì' vector'? –

+0

@DennisRitchie: 'const vector ' có thể là câu trả lời bạn đang tìm kiếm. – prazuber

+0

Tôi cần để có thể thêm các phần tử vào thùng chứa, và làm cho toàn bộ vector 'const' không cho phép điều đó, phải không? Tôi chỉ muốn chắc chắn rằng tôi không thể thay đổi các yếu tố đã có trong container. –

5

std::pair chỉ cần nội dung của nó có thể được gán nếu bạn cố gắng gán cho nó. Tuy nhiên, std::vector luôn yêu cầu chuyển nhượng cho mục đích phân bổ lại.

+0

Hm. Với ngữ nghĩa di chuyển mới, liệu điều đó có đúng không? –

+0

@NikosC. Tôi cho rằng vector chỉ sử dụng nhiệm vụ di chuyển trong trường hợp đó, mà vẫn là một nhiệm vụ. Chỉ là một đoán mặc dù. Ai đó sửa tôi nếu tôi sai. –

+1

@NikosC loại sẽ phải là Có thể sao chép HOẶC Có thể di chuyển. Vì vậy, ví dụ bạn có thể có một vector của unique_ptr, mà không phải là Copyable. – nunojpg

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