构建一个保持引用的unordered_map是否合法?

问题描述:

一般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

我想我找到了答案我自己为这个特定使用案例:

在为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将无法​​正常工作的任何算法。