C++ 构建包含引用的无序地图合法吗?
一般来说,STL容器不能保存引用等不可复制的类型。如果我以不应复制的方式构造容器,那么代码是否有效。它使用C++ 构建包含引用的无序地图合法吗?,c++,reference,containers,unordered-map,C++,Reference,Containers,Unordered Map,一般来说,STL容器不能保存引用等不可复制的类型。如果我以不应复制的方式构造容器,那么代码是否有效。它使用std=c++11和c++14编译gcc-7.2的某些版本,但以下内容有效吗?或者我可以期望它通过库升级中断吗?在这种情况下,我应该使用reference\u wrapper #include <unordered_map> struct S {}; void use (S&) {} void test() { S s1, s2; const std
std=c++11
和c++14
编译gcc-7.2的某些版本,但以下内容有效吗?或者我可以期望它通过库升级中断吗?在这种情况下,我应该使用reference\u 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));
}
#包括
结构S{};
无效使用(&){}
无效测试(){
s1,s2;
常数std::无序的_映射m{{0,s1},{1,s2};
使用(m.at(0));
}
编辑我确实需要一个标准参考。如果编译器/标准库的符合标准的更新会破坏代码,那么对我来说,工作也是不够的。所以给出的答案对我来说是不够的。我想我自己找到了这个特定用例的答案: 第23.5.4.3条中关于无序映射元素访问的标准明确省略了对
映射类型
的任何要求,即S&
,而对于运算符[]
,它必须是可默认构造的
返回:对x.second
的引用,其中x
是其键等效于k
的(唯一)元素
抛出:如果不存在类型为的异常对象,则该异常对象超出\u范围
在26.5.4.3和26.5.4.4中也间接地说明了这一点
因此,上述代码应能与任何标准实现一起使用
但是,诚然,正如评论中指出的那样,在构建后对容器进行变异,或应用任何需要构建或分配容器的值\u类型
或映射\u类型
的算法,都不会起作用。一般容器中可能存在的副本不仅需要用于构建,但也有许多算法可能无法按预期工作
mapped_type& at(const key_type& k);
const mapped_type& at(const key_type& k) const;