Что содержит элемент вектора, который перемещается? - PullRequest
2 голосов
/ 12 декабря 2011
#include <vector>
#include <iostream>
#include <memory>

int main()
{
    // create the vector
    std::vector< std::unique_ptr< int > > v;
    for ( int i = 0; i < 5; ++ i )
    {
        std::unique_ptr< int > newItem( new int(i) );
        v.push_back( std::move( newItem ) );
    }

    std::cout<<"vector's size before the move = " << v.size() << std::endl;

    // move one item
    auto it = move( v[2] );
    std::cout<<"moved element = " << *it << std::endl;
    std::cout<<"vector's size after the move = " << v.size() << std::endl;
if ( nullptr == v[2].get())
    std::cout<<"it is nullptr" << std::endl;
}

Приведенный выше пример перемещает один элемент из вектора, но размер вектора остался прежним.

Что содержит перемещенный элемент после перемещения?Это неопределенное поведение для доступа к этому элементу?Это nullptr (пример печатает, что это нуль)?

1 Ответ

5 голосов
/ 12 декабря 2011

Это не имеет ничего общего с вектором. std::uniqe_ptr определяет состояние объекта после перемещения, для него установлено значение null (20.7.1 / 4).

Как правило, объект, из которого был перемещен, имеет допустимое, но неопределенное состояние. Таким образом, кроме случаев, когда документы типового типа недоступны, вы можете получить к ним доступ. Определенные классы, возможно, должны давать более подробную информацию об этом состоянии, когда это возможно, но на что опирается вектор, так это:

  1. объект можно переместить снова (иначе вектор не сможет перераспределить)
  2. объект может быть уничтожен, если уничтожен вектор.

Таким образом, для типа, отличного от unique_ptr в векторе, вам, вероятно, следует подумать, что результирующее значение источника перемещения может быть любым из:

  1. «пустое» или «нулевое» значение типа,
  2. исходное значение,
  3. исходное значение цели хода,
  4. какое-то другое значение типа, о котором вы не задумывались.

Если вы все еще думаете, что стоит доступа к значению, которое может быть любым из них, продолжайте; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...