const TBigType& a = [](){
TBigType result;
// ...
return result;
}();
use(a); // by const ref
Можно ли записать результат в const ref, как это?Возврат локальной переменной в const ref от lambda
const TBigType& a = [](){
TBigType result;
// ...
return result;
}();
use(a); // by const ref
Можно ли записать результат в const ref, как это?Возврат локальной переменной в const ref от lambda
Ваша лямбда возвращает значение prvalue, поэтому выражение вызова является временным объектом, срок жизни которого расширен, потому что он привязан к ссылке.
ситуация совершенно аналогична приведенной ниже, простой пример:
int f() { return 12; }
const int& a = f();
Здесь a
обязан временный объект типа int
и значением 12
.
Если вы не укажете тип возврата лямбда, тип возврата всегда либо void
, либо тип объекта. Если вы хотите, чтобы ваш лямбда возвращал значение lvalue или xvalue, вам явно нужно указать тип возврата, например. как -> int&
, -> auto&
, -> decltype(auto)
и т. д.
Но было бы лучше дать конструктору перемещения «TBigType», если это возможно. –
@LightnessRacesinOrbit: Meh. Так или иначе, он будет скопирован. –
Я предпочитаю быть абсолютно уверенным. Pre-C++ 17, это конструктор перемещения. –