Переместить семантику и примитивные типы - PullRequest
9 голосов
/ 03 апреля 2012

Пример кода :

int main()
{
    std::vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::cout << "Printing v1" << std::endl;
    print(v1);
    std::vector<int> v2(std::make_move_iterator(v1.begin()),
                         std::make_move_iterator(v1.end()));
    std::cout << "Printing v1" << std::endl;
    print(v1);
    std::cout << "Printing v2" << std::endl;
    print(v2);

    std::vector<std::string> v3{"some", "stuff", "to",
                        "put", "in", "the", "strings"};
    std::cout << "Printing v3" << std::endl;
    print(v3);
    std::vector<std::string> v4(std::make_move_iterator(v3.begin()),
                                 std::make_move_iterator(v3.end()));
    std::cout << "Printing v3" << std::endl;
    print(v3);
    std::cout << "Printing v4" << std::endl;
    print(v4);
}

Вывод :

Printing v1
1 2 3 4 5 6 7 8 9 10
Printing v1
1 2 3 4 5 6 7 8 9 10
Printing v2
1 2 3 4 5 6 7 8 9 10
Printing v3
some stuff to put in the strings
Printing v3

Printing v4
some stuff to put in the strings

Вопросы

  1. Поскольку операции перемещения над примитивными типами являются всего лишь копией, могу ли я предположить, что v1 останется неизменным или состояние не указано даже для примитивных типов?

  2. Я предполагаю, что причина, по которой примитивные типы не имеют семантики перемещения, заключается в том, что копирование выполняется так же быстро или даже быстрее, верно?

1 Ответ

15 голосов
/ 03 апреля 2012
  1. Нет, если вы хотите предположить, что вы должны копировать, а не перемещать.

  2. При перемещении исходный объект остается действительным, но не указаннымгосударство.Примитивные типы do демонстрируют семантику перемещения.Тот факт, что исходный объект остается неизменным, говорит о том, что копирование является самым быстрым способом реализации перемещения.

...