2016-11-10 7 views

ответ

4

Ваша лямбда возвращает значение prvalue, поэтому выражение вызова является временным объектом, срок жизни которого расширен, потому что он привязан к ссылке.

ситуация совершенно аналогична приведенной ниже, простой пример:

int f() { return 12; } 

const int& a = f(); 

Здесь a обязан временный объект типа int и значением 12.

Если вы не укажете тип возврата лямбда, тип возврата всегда либо void, либо тип объекта. Если вы хотите, чтобы ваш лямбда возвращал значение lvalue или xvalue, вам явно нужно указать тип возврата, например. как -> int&, -> auto&, -> decltype(auto) и т. д.

+1

Но было бы лучше дать конструктору перемещения «TBigType», если это возможно. –

+1

@LightnessRacesinOrbit: Meh. Так или иначе, он будет скопирован. –

+0

Я предпочитаю быть абсолютно уверенным. Pre-C++ 17, это конструктор перемещения. –