std::map::insert
có tình trạng quá tải cho R-giá trị:
std::pair<iterator,bool> insert(value_type&&);
bất cứ biểu thức mà liên kết với tình trạng quá tải này sẽ gọi constructor R-giá trị. Kể từ std::map<K,V>::value_type
là std::pair<const key_type, mapped_type>
, và std::pair
có một constructor mà mất R-giá trị:
template<class U1, class U2>
pair(U1&& x, U2&& y);
sau đó bạn được đảm bảo rằng nhà thầu Giá trị R cho key_type
và mapped_type
sẽ được gọi, cả trong việc tạo ra các đối tượng pair
, và trong chèn bản đồ, miễn là bạn chèn các cặp sử dụng một biểu thức mà tạo ra R-giá trị, chẳng hạn như:
map1.insert(std::make_pair(0, Huge());
HOẶC
map1.insert(std::make_pair(0, std::move(huge1));
Tất nhiên, tất cả điều này phụ thuộc vào Huge
có một constructor Giá trị R thích hợp:
Huge(Huge&& h)
{
...
}
Cuối cùng, bạn cũng có thể sử dụng std::map::emplace
nếu bạn chỉ đơn giản là muốn xây dựng một đối tượng mới Huge
như một yếu tố trên bản đồ.
Nguồn
2013-02-11 16:33:33
Tôi đã hỏi chính xác điều này một vài ngày trước: http://stackoverflow.com/questions/14581414/insert-map-entry-by-r-value-moving-of-mapped-type – Chowlett
Không hoàn toàn giống nhau, @Chowlett. – Yakk
@Yakk - ... vì loại khóa cũng có sẵn để di chuyển, nơi tôi cần để đảm bảo nó được sao chép? Hay tôi còn thiếu cái gì khác? – Chowlett