Как использовать C ++ 11 std :: move семантика.Я пытался написать код, вывод, который я получаю, это что-то другое - PullRequest
0 голосов
/ 06 июня 2018
#include <iostream>
#include<vector>

using namespace std;
int function(int &&p)
{
    cout<<"function:"<<p<<endl;

    return 0;
}
int main()
{

    int a =10;
    function(std::move(a));
    cout<<"main:"<<a<<endl;


    return 0;
}

Вывод, который я получаю, следующий:

function:10
main:10

Но не должно ли быть так, как показано ниже?

function:10
main:

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Но не должно ли быть так, как показано ниже?

Нет, не должно.


Теория

1) std::move:

std::move создает выражение xvalue , которое идентифицирует его аргумент t.Это в точности эквивалентно static_cast для rvalue-ссылки type.

2) Rvalue-ссылок :

Rvalue-ссылокможет использоваться для продления времени жизни временных объектов (обратите внимание, lvalue ссылки на const могут также продлить время жизни временных объектов , но онине изменяемый через них):

Вывод: , поскольку a не является временным, ваш код по существу эквивалентен прохождению a как ссылка .


Примечание: в стандартной библиотеке

Если не указано иное, все объекты стандартной библиотеки, которыебыли перемещены из находятся в допустимом, но неопределенном состоянии.

0 голосов
/ 06 июня 2018

Технически std::move не перемещает ничего, просто дает ссылку на значение.Фактическая семантика перемещения чего-либо происходит только потому, что это вызывает разрешение перегрузки для вызова различных функций, поэтому:

std::vector<int> a{1, 2, 3};
std::vector<int> b{std::move(a)};

Это эквивалентно:

std::vector<int> a{1, 2, 3};
std::vector<int> b{static_cast<std::vector<int>&&>(a)};

Опять же, вrvalue ссылка &&, которая заставляет его "перемещать" вещи, вся семантика перемещения находится в конструкторе std::vector.Тип int не имеет специальной семантики перемещения, поэтому он этого не делает.

Это имеет смысл.Для std::vector перемещение вектора и обнуление оригинала обходится дешевле, чем копирование.Для int обнуление оригинала на самом деле на дороже , чем просто его копирование - вы все равно должны скопировать значение, так что нет смысла выполнять дополнительную работу по выбрасыванию оригинала.

...