2017-10-16 10 views
0

一般に、STLコンテナは参照などの非CopyAssignableタイプを保持できません。コピーを行わないようにコンテナを構築すると、コードは有効です。 gcc-7.2のいくつかのバージョンでstd=c++11c++14とコンパイルされますが、以下のものが有効ですか、それともライブラリのアップグレードで破損すると思いますか?この場合、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)); 
} 

編集私は本当に標準への参照が必要です。コンパイラ/標準ライブラリの標準準拠の更新がコードを破る可能性がある場合は、Works for meも十分ではありません。だから"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要素にアクセスするための句23.5.4.3でC++11標準は、具体的には、しばらくoperator[]で、それがS&で、mapped_typeのための任意の要件をリスト省略DefaultConstructibleである必要があります。

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

戻りxキーkと等価である(固有の)要素であるx.secondを参照。

例外:このような要素が存在しない場合は、タイプout_of_rangeの例外オブジェクトです。

C++17また、間接的に26.5.4.3と26.5.4.4でこの効果が出ています。

したがって、上記コードは、は標準実装で動作する必要があります。

しかし、それは本当です - コメントで指摘したように - 建設後の容器を変異またはコンテナのvalue_typemapped_type動作しませんを構築するか、割り当てる必要が任意のアルゴリズムを適用すること。

関連する問題