构建一个保持引用的unordered_map是否合法?
问题描述:
一般STL容器不能容纳非CopyAssignable
类型,如引用。如果我以不复制副本的方式构建容器,那么代码是否有效。它编译与std=c++11
和c++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"给出的答案对我来说还不够。
答
我想我找到了答案我自己为这个特定使用案例:
在为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_type
或mapped_type
将无法正常工作的任何算法。
可能重复的[无序的\ _map作为参考值](https://stackoverflow.com/questions/24719044/unordered-map-with-reference-as-value) – davidhigh
在一般容器中需要CopyAssignable不仅用于构造,但也有许多算法可能无法按预期工作 – user463035818