C ++ 0x T оператор + (const T &, T &&) шаблон, все еще нужно переместить? - PullRequest
7 голосов
/ 21 августа 2011

Некоторое время назад мне сказали, что обычному шаблону для реализации двухрядных операторов требуется конечный move в возвращаемом.

Matrix operator+(const Matrix &a, Matrix &&b) {
    b += a;
    return std::move(b);
}

Но теперь есть специальное правило, что в return компилятор может обрабатывать возвращаемое значение как временное, и тогда в этом нет необходимости - достаточно простого return b.

Но опять же, b имеет имя в этой функции, следовательно, это LValue - что мешает компилятору считать его временным, и требуется move.

Это все еще имеет местов самой последней версии C ++ 0x Standard? Нам нужен move для реализации вышеуказанного шаблона?

Ответы [ 2 ]

7 голосов
/ 22 августа 2011

Вам нужен явный std::move в этом примере, потому что b не является именем энергонезависимого автоматического объекта.Ссылка 12.8 [class.copy] / p31 / b1:

  • в выражении возврата в функции с типом возвращаемого класса, когда выражение является именем энергонезависимого автоматический объект (отличный от параметра функции или оператора catch) с тем же cv-неквалифицированным типом, что и тип возвращаемого функцией, операцию копирования / перемещения можно опустить, создав автоматический объект непосредственно в возвращаемое значение функции
0 голосов
/ 22 августа 2011

Я не уверен, почему эта функция возвращает значение.Разве эта функция не должна возвращать Matrix&&, как показано ниже?

Matrix&& operator+(const Matrix &a, Matrix &&b) {
  b += a;
  return std::move(b);
}

Это имеет дополнительное преимущество, заключающееся в том, что x1 + x2 + x3 + ... + xn создает не более одного временного, что важно, если Matrix оказывается выделенным стеком (кактогда он ничего не получает от ходов).

Я думаю, что подписи должны быть такими:

Matrix&& operator+(Matrix &&a,      Matrix &&b     );
Matrix&& operator+(const Matrix &a, Matrix &&b     );
Matrix&& operator+(Matrix &&a,      const Matrix &b);
Matrix   operator+(const Matrix &a, const Matrix &b);
...