Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构建包含引用的无序地图合法吗?_C++_Reference_Containers_Unordered Map - Fatal编程技术网

C++ 构建包含引用的无序地图合法吗?

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

一般来说,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::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;