stl容器的引用C++ 11

nik*_*ack 3 c++

我知道这个问题被问了一百万次.大多数答案只是说对象应该是CopyAssignable和CopyConstructible.但文档清楚地说这是规则(直到C++ 11)!但它仍然无效.为什么?

eer*_*ika 10

是的,现在要求不那么严格了.但是,在您引用的部分正下方,链接的文档明确指出:

对元素施加的要求取决于对容器执行的实际操作.通常,要求元素类型是完整类型并满足Erasable的要求,但许多成员函数强加了更严格的要求.(自C++ 11以来)

引用不符合Erasable的要求,因此它们仍然无法工作.


101*_*010 8

规则适用于C++ 11.在C++ 11中,要求元素类型是完整类型,并且满足Erasable的要求,在这种情况下,引用不是.

但是,您可以使用std :: reference_wrapper来包装引用并将它们存储在向量中.

std::vector<std::reference_wrapper<T>> vector_of_references;
Run Code Online (Sandbox Code Playgroud)


Jon*_*ely 7

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

这并不意味着允许引用,只是因为一个规则被放宽并不意味着绝对任何类型都可以放在容器中.

正如您引用的cppreference页面所说的C++ 11

对元素施加的要求取决于对容器执行的实际操作.通常,要求元素类型是完整类型并满足要求Erasable,但许多成员函数强加了更严格的要求.

Erasable 要求这是有效的:

allocator_traits<A>::destroy(m, p)
Run Code Online (Sandbox Code Playgroud)

17.6.3.5 [allocator.requirements]中的分配器要求说分配器处理任何非const对象类型,并且引用不是对象类型,因此您不能分配或取消分配引用,因此您不能将它们放在容器中.


5go*_*der 5

\xc2\xa7 23.2.1 [container.requirements.general] N4140 的 \xc2\xb6 1 说(强调我的):

\n\n
\n

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

\n
\n\n

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

\n