Возврат ссылки на временный объект [дубликат]

flat_list = []
for i in list_of_list:
    flat_list+=i

Этот код также отлично работает, так как он просто расширяет список. Хотя это очень похоже, но только для цикла. Таким образом, он имеет меньшую сложность, чем добавление 2 для циклов.

9
задан sharptooth 17 April 2012 в 14:01
поделиться

4 ответа

Полное выражение - это выражение, которое не является подвыражением другого выражения. В этом случае полное выражение, содержащее вызов function( 10 ), является выражением присваивания:

const int& reference = function( 10 );

Чтобы вызвать function с аргументом 10, временным объектом const-reference является созданный для временного целочисленного объекта 10. Время жизни временного целого и временная const-ссылка распространяются через назначение, поэтому, хотя выражение присваивания действительно, попытка использовать целое число, на которое ссылается reference, является Undefined Behavior, поскольку reference больше не ссылается на живой объект.

Стандарт C ++ 11, я думаю, проясняет ситуацию:

Временное связывание ссылки или временное, являющееся полным объектом подобъекта, которая привязана к ссылке, сохраняется для времени жизни ссылки, кроме:

...

- временная привязка к эталонному параметру в вызове функции (5.2.2) сохраняется до завершение полного выражения, содержащего вызов.

РЕДАКТИРОВАТЬ: «Временная привязка ссылки ... сохраняется для срока службы ссылки». В этом случае время жизни ссылки заканчивается в конце выражения присваивания, равно как и время жизни временного целого.

9
ответ дан Daniel Trebbien 25 August 2018 в 12:12
поделиться

Эта важная часть

Временная привязка ссылки

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

Вы не можете продлить время жизни, передав ссылку.

1
ответ дан Bo Persson 25 August 2018 в 12:12
поделиться

Это будет скомпилировано, но в итоге вы получите свисающую ссылку. param освобождается после возвращения function.

Функция
  1. вызывается со ссылкой на функцию временного анонимного объекта
  2. , возвращает ссылку
  3. теперь, когда функция вернула временный параметр
  4. ссылка теперь висит, когда объект был уничтожен

Если вы сделали его неконстантным, то он не был бы скомпилирован, потому что вы не можете передать не - ссылается на анонимный объект.

2
ответ дан user 25 August 2018 в 12:12
поделиться

Из C ++ 11 viepoint ссылка, возвращаемая функцией, является not временным:

12.12.1 Временные члены типа класса создаются в различных контекстах : привязка ссылки на prvalue (8.5.3), возвращающая значение pr (6.3), преобразование, которое создает prvalue (4.1, 5.2.9, 5.2.11, 5.4), генерируя исключение (15.1), вводя обработчик (15.3) и некоторые инициализации (8.5).

Функция, возвращающая ссылку dosn't return prvalue ("pure rvalue"), поэтому она не является временной. Это кажется вполне естественным: компилятор не может управлять временем жизни ссылочных объектов, это ответственность программиста

Таким образом, компилятор не предоставляет никаких гарантий лифта для const int & amp; поскольку он не ограничен временным.

2
ответ дан user396672 25 August 2018 в 12:12
поделиться
Другие вопросы по тегам:

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