2016-09-12 37 views
12

tôi thấy rằng phương pháp insert của std::mapstd::unordered_map sẽ thay đổi từstd :: thay đổi bản đồ :: chèn trong C++ 17

template<class P> std::pair<iterator,bool> insert(P&& value); (C++11) 

để

std::pair<iterator,bool> insert(value_type&& value); (C++17) 

Tuy nhiên, đối với những vùng chứa, value_typestd::pair<A const, int>. Hai câu hỏi ở đây:

  1. Tại sao thay đổi này? Nhược điểm là gì?
  2. Làm cách nào để hoạt động để di chuyển khóa khi chèn? Phiên bản C++ 11 chấp nhận bất cứ điều gì (ràng buộc trên Pdefault_constructible<value_type, P&&>), sau đó std::pair<A, int> - phần lớn thời gian là kiểu đối số này vì nó được trả về bởi std::make_pair - và có thể gọi hàm khởi tạo của A. Nhưng trong phiên bản C++ 17, đối số này được đúc thành value_type, trong đó A là const, sau đó không thể di chuyển được. A phải được sao chép, nếu tôi không nhìn cái gì đó. Hay C++ 17 thay đổi bất cứ điều gì ở phía đó?

Cảm ơn!

+3

Có vẻ như tính năng đó đã được thêm vào bởi [LWG 2354] (http://wg21.link/lwg2354). –

+7

Nó không phải "từ X đến Y". Đó là một quá tải bổ sung. –

Trả lời

9

Quá tải bổ sung không phải mẫu cho insert đã được thêm vào C++ 17.

Quá tải như vậy có lợi thế là nó cho phép cú pháp .insert({ {key}, {value, args} }) - {} dựa trên cấu trúc. template đối số không thể được thông qua {} hướng dẫn xây dựng dựa trên mà không có loại rõ ràng.

+0

Cảm ơn; thực sự nó là một quá tải bổ sung sẽ cho phép viết '{}' dựa trên cấu trúc này, nhưng nó vẫn sẽ được coi là một cặp 'std :: ', vì vậy tôi đoán 'key' trong ví dụ của bạn đã thắng không được di chuyển nhưng sao chép ...? Tôi thực sự khá chắc chắn các C++ guys nghĩ về điều đó và nó sẽ được di chuyển, tôi chỉ không nhìn thấy * làm thế nào * nếu nó là const :) – AntiClimacus

+0

@AntiClimacus Nó sẽ gọi các nhà xây dựng của 'std :: pair', bất cứ điều gì họ là. Nếu 'std :: pair ' có thể được xây dựng bởi (say) '(Key &&, Value &&)' thì dữ liệu có thể được chuyển vào 'insert'. Tuy nhiên, nó không thể được chuyển vào dữ liệu trong cây, vâng. – Yakk

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