Возвращается rvalue более эффективной ссылкой?

Да, но я никогда не видел, что любой пытается реализовать любой вид полиморфизма с C.

119
задан Johannes Schaub - litb 3 October 2011 в 12:59
поделиться

1 ответ

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

Это возвращает висящую ссылку, как и в случае ссылки lvalue. После возврата из функции временный объект будет уничтожен. Вы должны вернуть Beta_ab по значению, как показано ниже

Beta_ab
Beta::toAB() const {
    return Beta_ab(1, 1);
}

Теперь он правильно перемещает временный объект Beta_ab в возвращаемое значение функции. Если компилятор может, он вообще избежит перемещения, используя RVO (оптимизация возвращаемого значения). Теперь вы можете сделать следующее:

Beta_ab ab = others.toAB();

И он переместит конструкцию временного объекта в ab или выполнит RVO, чтобы вообще не выполнять перемещение или копирование. Я рекомендую вам прочитать BoostCon09 Rvalue References 101 , в котором объясняется этот вопрос и как (N) RVO взаимодействует с этим.


Ваш случай возврата ссылки rvalue был бы хорошей идеей в других случаях . Представьте, что у вас есть функция getAB () , которую вы часто вызываете временно. Не оптимально заставлять его возвращать ссылку на const lvalue для временных rvalue. Вы можете реализовать это так:

struct Beta {
  Beta_ab ab;
  Beta_ab const& getAB() const& { return ab; }
  Beta_ab && getAB() && { return move(ab); }
};

Обратите внимание, что move в этом случае не является необязательным, потому что ab не является ни локальным автоматическим, ни временным rvalue. Теперь ref-qualifier && говорит, что вторая функция вызывается для временных значений rvalue, делая следующий ход вместо copy

Beta_ab ab = Beta().getAB();
222
ответ дан 24 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: