Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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++ stl引用容器C++;11_C++ - Fatal编程技术网

C++ stl引用容器C++;11

C++ stl引用容器C++;11,c++,C++,我知道这个问题被问了无数次。大多数答案只是说对象应该是可复制可分配和可复制可构造的。但是明确地说这是规则(直到C++11)!但它仍然不起作用。为什么?这些规则一直适用到C++11。在C++11中,要求元素类型是完整类型,并且满足可擦除的要求,在这种情况下,引用是不可擦除的 但是,您可以使用包装引用并将其存储在向量中 std::vector<std::reference_wrapper<T>> vector_of_references; std::向量向量向量; N414

我知道这个问题被问了无数次。大多数答案只是说对象应该是可复制可分配和可复制可构造的。但是明确地说这是规则(直到C++11)!但它仍然不起作用。为什么?

这些规则一直适用到C++11。在C++11中,要求元素类型是完整类型,并且满足可擦除的要求,在这种情况下,引用是不可擦除的

但是,您可以使用包装引用并将其存储在向量中

std::vector<std::reference_wrapper<T>> vector_of_references;
std::向量向量向量;

N4140第23.2.1节[集装箱要求.概述]第1节规定(重点):

容器是存储其他对象的对象。它们通过构造函数、析构函数、插入和擦除操作控制这些对象的分配和释放


但是引用不是对象,因此不能将其放入标准库容器中。

是的,现在的要求不那么严格了。但是,在您引用的零件正下方,链接文档清楚地说明:

对构件施加的要求取决于对容器执行的实际操作。通常,要求元素类型为完整类型并满足可擦除的要求,但许多成员函数的要求更为严格(从C++11开始)


引用不满足可擦除的要求,因此它们仍然无法工作。

C++11放宽了容器要求,以便可以在容器中使用不可复制的类型,只要您避免需要复制元素的操作

但这并不意味着引用是允许的,仅仅因为一条规则被放松了,并不意味着任何类型都可以放在容器中

作为您为C++11引用的参考页

对构件施加的要求取决于对容器执行的实际操作。通常,要求元素类型为完整类型,并满足
可擦除
的要求,但许多成员函数有更严格的要求

要求这是有效的:

allocator_traits<A>::destroy(m, p)

allocator\u 17.6.3.5[allocator.requirements]中的特性要求说,分配器处理任何非常量对象类型,引用不是对象类型,因此您无法分配或取消分配引用,因此您无法将它们放入容器中。

是的,我知道
std::reference\u包装器
。我仍然不确定规则。你是说文档中有错误吗?@101010这不是额外的错误requirement@101010新的要求没有c++11之前严格。类型不再需要是可复制分配和可复制构造的,才能在向量中使用,只要它是可擦除的。你可以编辑你的答案,说引用不满足新的限制()。嗨,乔纳森,我对你的答案投了赞成票,但你能解释一下“对象类型”到底是什么吗?找不到显式定义。谢谢