2012-12-17 22 views
8

Chức năng thành viên này, không có hiệu lực được xác định trong tiêu chuẩn (chỉ nhận xét), sẽ bị hạn chế sử dụng nếu không được phép tái phân bổ. Nhưng đoạn duy nhất tôi tìm thấy trong tiêu chuẩn dường như áp dụng sẽ là 23.2.1/11:Là véc tơ :: shrink_to_fit có được phép tái phân bổ không?

"Trừ khi có quy định khác hoặc bằng cách xác định chức năng về các chức năng khác), hãy gọi thành viên chứa hoặc chuyển một vùng chứa làm đối số cho hàm thư viện sẽ không làm mất hiệu lực các trình vòng lặp tới hoặc thay đổi giá trị của các đối tượng trong vùng chứa đó. "

Vì reallocations invalid iterators, điều này có nghĩa là shrink_to_fit không thể chính thức tái phân bổ? Nếu vậy, chức năng chỉ có thể có hiệu lực đối với việc triển khai, nơi chức năng giảm không phân bổ lại, nếu có ...

Trả lời

7

Tôi đồng ý, ý định rõ ràng là shrink_to_fit() có thể phân bổ lại, vì vậy nó phải được phép làm mất hiệu lực trình lặp.

Chỉ có thể tôn trọng yêu cầu nếu việc triển khai cung cấp tính năng giống như realloc() cho người cấp phát đảm bảo không di chuyển bộ nhớ khi thu hẹp khối, điều này sẽ không làm mất hiệu lực trình lặp. Nhưng tôi không tin đó là những gì được dự định, như ngụ ý bởi recently-added requirement rằng TMoveInsertable vào vectơ, bởi vì yêu cầu đó chỉ liên quan nếu các phần tử được di chuyển đến vị trí mới, điều này sẽ làm mất hiệu lực vòng lặp.

Tôi nghĩ bạn nên submit an issue để làm rõ rằng shrink_to_fit() có thể làm mất hiệu lực vòng lặp. Vấn đề sẽ áp dụng cho basic_string, dequevector.

+0

yêu cầu cho T là MoveInsertable ở đâu? – soulie

+1

23.3.6.3 [vector.capacity] đoạn 7 trong bài báo hiện tại, nó được thêm vào sau C++ 11 bởi [LWG 2033] (http://cplusplus.github.com/LWG/lwg-defects.html# 2033). N.B. thuật ngữ là "' MoveInsertable' thành _X_ ", không có nghĩa gì khi nói một kiểu chỉ là' MoveInsertable' bạn phải nói những gì bạn đang chèn nó _into_ –

+0

Chắc chắn những bổ sung đó làm rõ rất nhiều tác dụng dự định của hàm . – soulie

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