构建一个持有引用的unordered_map是否合法
Is it legal to construct an unordered_map holding references?
一般来说,STL容器不能容纳非CopyAssignable
类型,如引用。如果我以不应进行复制的方式构造容器,那么代码是否有效。它使用std=c++11
编译,并使用某些版本的 gcc-7.2 进行c++14
编译,但以下内容是否有效,或者我可以期望它因库升级而中断?在这种情况下,我应该使用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"给出的答案对我来说是不够的。
我想
我自己为这个特定的用例找到了答案:
第23.5.4.3条C++11标准中关于unordered_map元素访问特别省略了列出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
的算法是行不通的。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶