Подтвердить что ты не робот

Разве бесполезно объявлять локальную переменную как rvalue-reference, например. T && r = move (v)?

Не могли бы вы, ребята, дать мне иллюстративный пример при определенных обстоятельствах, чтобы доказать, что следующие утверждения полезны и необходимы?

AnyTypeMovable   v;
AnyTypeMovable&& r = move(v);
4b9b3361

Ответ 1

Нет, AnyTypeMovable&& r = move(v); здесь вообще не полезно.

Рассмотрим следующий код:

#include <iostream>
#include <vector>

class MyMovableType
{
        int i;
public:
        MyMovableType(int val): i(val){}
        MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
        MyMovableType(const MyMovableType& r){ this->i = r.i; }
        int getVal(){ return i; }
};

int main()
{
        std::vector<MyMovableType> vec;
        MyMovableType a(10);
        MyMovableType&& aa = std::move(a);

        vec.push_back(aa);

        std::cout << a.getVal() << std::endl;

        return 0;

}

As aa является l-значением (как отмечено R. Martinho Fernandes, а также Xeo - названная rvalue-reference является значением lvalue), это приведет к печати 10, указывающей, что перемещение не было выполнено (ни в присваивании, ни при вызове push_back), поэтому вам все равно нужно std::move его к методу push_back, как в этом случае:

#include <iostream>
#include <vector>

class MyMovableType
{
        int i;
public:
        MyMovableType(int val): i(val){}
        MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
        MyMovableType(const MyMovableType& r){ this->i = r.i; }
        int getVal(){ return i; }
};

int main()
{
        std::vector<MyMovableType> vec;
        MyMovableType a(10);
        MyMovableType&& aa = std::move(a);

        vec.push_back(std::move(aa));

        std::cout << a.getVal() << std::endl;

        return 0;

}

будет выполнено перемещение, поэтому распечатка будет -1. Поэтому, несмотря на то, что вы передаете aa в push_back, вам все равно нужно передать его через std::move.

Ответ 2

Обратите внимание, что Named rvalue имеет значение lvalue. Поэтому вы должны использовать std:: forward.

#include <iostream>
#include <vector>

class MyMovableType
{
        int i;
public:
        MyMovableType(int val)  noexcept   : i(val){}
        MyMovableType(MyMovableType&& r) noexcept { this->i = r.i; r.i = -1; }
        MyMovableType(const MyMovableType& r) noexcept{ this->i = r.i; }
        int getVal()const noexcept{ return i; }
};

int main()
{
        std::vector<MyMovableType> vec;
        MyMovableType a(10);
        MyMovableType&& aa = std::move(a);

        vec.push_back( std::forward<decltype(a)>(aa) );

        std::cout << a.getVal() << std::endl; // -1 printed.

        return 0;

}