为什么向量的 insert() 创建插入元素的副本并分配给该副本,而不是插入的元素?

Mam*_*pac 1 c++ insert vector

考虑一个insert(iterator position, const value_type &x)调用:如果没有发生重新分配(容量!=大小),那么在向量的许多实现中我看到了这种行为:

     ...
template<typename _Tp, typename _Alloc>
     void
     vector<_Tp, _Alloc>::
     _M_insert_aux(iterator __position, const _Tp& __x)
 #endif
{
    ...
    if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
    {
       this->_M_impl.construct(this->_M_impl._M_finish,
                   _GLIBCXX_MOVE(*(this->_M_impl._M_finish
                           - 1)));
       ++this->_M_impl._M_finish;
     #ifndef __GXX_EXPERIMENTAL_CXX0X__
       _Tp __x_copy = __x;
     #endif
       _GLIBCXX_MOVE_BACKWARD3(__position.base(),
                   this->_M_impl._M_finish - 2,
                   this->_M_impl._M_finish - 1);
     #ifndef __GXX_EXPERIMENTAL_CXX0X__
       *__position = __x_copy;
     ...
Run Code Online (Sandbox Code Playgroud)

为什么不分配*__position__x?创建副本不会导致额外的空间浪费吗?难道就不能避免创建副本吗?

use*_*522 5

__x_copy仅当__GXX_EXPERIMENTAL_CXX0X__未设置宏时才使用。这意味着它仅在 C++98 和 C++03 模式下使用。

如今,您可能不应该无缘无故地使用这些旧模式。

宏名称还表明您有 libstc++ 的旧副本。它于 2012 年被替换:https://gcc.gnu.org/git/?p =gcc.git;a=commit;h=734f50238f863ae90d2e8caa2323aaa02380ff48


在移动容器的元素以释放新元素应插入的位置之前,__x会创建一个副本,因为它可能__x引用容器中可能在此操作中重新定位的元素,从而使引用无效。至少在我看来是这样的。

如果我没记错的话,如果没有另外说明的特定先决条件,过去和现在都允许将对同一容器的元素的引用传递给其成员函数,只要这些是左值引用,而不是右值引用。