2017-10-16 63 views
0

一般STL容器不能容納非CopyAssignable類型,如引用。如果我以不復制副本的方式構建容器,那麼代碼是否有效。它編譯與std=c++11c++14與某些版本的gcc-7.2,但以下有效,或我可以指望它與圖書館升級打破?在這種情況下,我應該使用reference_wrapper嗎?構建一個保持引用的unordered_map是否合法?

#include <unordered_map> 

struct S {}; 

void use (S&) {} 

void test() { 
    S s1, s2; 
    const std::unordered_map<int, S&> m{{0, s1}, {1, s2}}; 
    use(m.at(0)); 
} 

編輯我真的需要標準的參考。如果符合標準的編譯器/標準庫更新可能會破壞代碼,對我來說也是不夠的。所以給我"unordered_map with reference as value"給出的答案對我來說還不夠。

+4

可能重複的[無序的\ _map作爲參考值](https://stackoverflow.com/questions/24719044/unordered-map-with-reference-as-value) – davidhigh

+0

在一般容器中需要CopyAssignable不僅用於構造,但也有許多算法可能無法按預期工作 – user463035818

回答

1

我想我找到了答案我自己爲這個特定使用案例:

在爲unordered_map元素訪問專門忽略了聲明,列出了mapped_type任何要求,條款23.5.4.3的C++11標準,即S&,同時與operator[]它必須是DefaultConstructible

mapped_type& at(const key_type& k); 
const mapped_type& at(const key_type& k) const; 

返回:一個參照x.second,其中x是(唯一的)元素,其關鍵是相當於k

拋出out_of_range類型的異常對象,如果不存在這樣的元素。

C++17也在26.5.4.3和26.5.4.4中間接地說了這個事情。

因此,上面的代碼應該與任何標準的實施工作。

然而,這是事實 - 在評論中指出 - 即突變施工後的容器或將需要建造或分配容器的value_typemapped_type將無法​​正常工作的任何算法。

相關問題