2013-04-06 34 views
9

Trước sự ngạc nhiên của tôi, tôi gặp lỗi khi cố gắng sử dụng std::vector::get_allocator() với một trình cấp phát không thể sao chép được. Tại sao std::vector::get_allocator() trả lại theo giá trị chứ không phải bằng tham chiếu?Tại sao std :: vector :: get_allocator() trả về theo giá trị?

template<typename T> 
class nc_allocator { 
public: 
    using value_type = T; 

    nc_allocator(nc_allocator const&) = delete; 
    nc_allocator& operator=(nc_allocator const&) = delete; 

    // Other required members. 
}; 

std::vector<int, nc_allocator<int>> v; 
// boom: use of deleted function 
//   'nc_allocator<T>::nc_allocator(const nc_allocator<T>&) [with T = int]' 
v.get_allocator(); 
+2

Tôi nghi ngờ rằng các phiên bản của trình phân bổ có nghĩa vụ phải được xử lý như xử lý. Bằng chứng của điều này là hai người phân bổ chỉ được coi là bình đẳng nếu người ta có thể xóa các đối tượng khác. –

Trả lời

7

Tôi đã nhận ra lỗi khi cố gắng sử dụng std::vector::get_allocator() với một cấp phát phi copyable.

Tiêu chuẩn cấm bạn làm như vậy. Yêu cầu cấp phát trong trạng thái 17.6.3.5 cho biết người cấp phát có thể sao chép được.

X a1(a);   Shall not exit via an exception. 
       post: a1 == a 
X a1(move(a)); Shall not exit via an exception. 
       post: a1 equals the prior value 
       of a. 

Vì vậy, trả về theo giá trị là cách trả lại chính xác, liên quan đến yêu cầu cấp phát được xác định theo tiêu chuẩn.

Tôi không chắc chắn lý do tại sao đây là yêu cầu nhưng nếu người phân bổ không được phép có thể được phép, tối ưu hóa cơ sở trống sẽ không hoạt động nữa.

+0

Nói đúng ra điều này chỉ nói rằng thao tác sao chép không được thoát qua ngoại lệ; nó không nói rằng nó phải là có thể. –

+2

Nó nói rằng biểu thức này phải hợp lệ và biểu thức này giống hệt với các kiểu 'CopyConstructible'. Nó thậm chí còn mạnh hơn kể từ khi sao chép không được ném một ngoại lệ. – ipc

+0

Nó không phải là mạnh hơn so với văn bản nguyên văn "thành viên get_allocator() trả về một bản sao" –

1

Tiêu chuẩn đơn giản là mệnh lệnh như vậy:

[C++11: 23.2.1/7]:[..] Trong tất cả các loại container quy định tại khoản này, thành viên get_allocator() trả về một bản sao của cấp phát sử dụng để xây dựng bình đựng chất hay , nếu cấp phát mà đã được thay thế, một bản sao của việc thay thế gần đây nhất [..]

tôi nghi ngờ @ đúng của Vaughn trong giả thuyết của ông rằng allocators có nghĩa là để được u sed như "xử lý".

Bằng cách rất tương tự lỏng lẻo, bạn có bao giờ viết một hàm không thể sao chép để sử dụng với thuật toán chuẩn không?

+4

Nhưng tại sao tiêu chuẩn lại nói như vậy? –

+0

@Zoidberg: Bởi vì ai đó đã quyết định rằng nó phải. Cố gắng hợp lý hóa lý do tại sao X được tạo ra với thuộc tính Y là cả hai không xây dựng và không có chủ đề trên Stack Overflow. –

+0

Làm cách nào để thực hiện phần này của tiêu chuẩn "nếu người cấp phát đó đã được thay thế"? –

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