通常,STL容器不能保存非CopyAssignable
类型,例如引用。如果我以不应该进行复制的方式构造容器,那么代码是有效的。它使用std=c++11
和c++14
与某些版本的gcc-7.2进行编译,但是以下是有效的还是我希望它能够在库升级时中断?在这种情况下我应该使用reference_wrapper
吗?
#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"给出的答案对我来说还不够。
答案 0 :(得分:1)
我想我自己找到了这个特定用例的答案:
第23.5.4.3节中针对unordered_map元素访问的C++11标准明确省略列出char
的任何要求,即mapped_type
,而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
无效。