Почему бы не определить ссылку rvalue как выражение rvalue? - PullRequest
5 голосов
/ 30 июня 2019

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

class X {
    std::vector<int> _v;
public:
    X(std::vector<int>&& v): _v(std::move(v)) {}
};

Компилятор вызывает этот конструктор только для объектов, которые могут быть перемещены. Так почему бы просто не определить ссылки rvalue в качестве выражений rvalue и не писать каждый раз, когда для них используется std :: move?

Список инициализации члена ctor будет выглядеть так:

_v(v)

Но это все равно будет ходом, а не копией.

1 Ответ

13 голосов
/ 30 июня 2019

Несмотря на то, что в этом распространенном случае требуется std::move, считалось, что неявное перемещение, вызывающее ошибку времени выполнения в некоторых случаях, будет более вредным.

Например:

class Y
{
public:
    Y(const std::vector<int>& v);
};

class X {
    std::vector<int> v_;
    Y                y_;
public:
    X(std::vector<int>&& v): v_(v), y_(v) {}
};

В этом модифицированном примере конструктор X дважды использует v. Если первое использование v неявно перемещено, то второе использование v, скорее всего, не даст ожидаемого значения.

Таким образом, чтобы избежать случайного «использования после перемещения», если у него есть имя, его можно использовать более одного раза, и поэтому безопаснее рассматривать его как lvalue.

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