flat_list = []
for i in list_of_list:
flat_list+=i
Этот код также отлично работает, так как он просто расширяет список. Хотя это очень похоже, но только для цикла. Таким образом, он имеет меньшую сложность, чем добавление 2 для циклов.
Полное выражение - это выражение, которое не является подвыражением другого выражения. В этом случае полное выражение, содержащее вызов function( 10 )
, является выражением присваивания:
const int& reference = function( 10 );
Чтобы вызвать function
с аргументом 10
, временным объектом const-reference является созданный для временного целочисленного объекта 10
. Время жизни временного целого и временная const-ссылка распространяются через назначение, поэтому, хотя выражение присваивания действительно, попытка использовать целое число, на которое ссылается reference
, является Undefined Behavior, поскольку reference
больше не ссылается на живой объект.
Стандарт C ++ 11, я думаю, проясняет ситуацию:
Временное связывание ссылки или временное, являющееся полным объектом подобъекта, которая привязана к ссылке, сохраняется для времени жизни ссылки, кроме:
...
- временная привязка к эталонному параметру в вызове функции (5.2.2) сохраняется до завершение полного выражения, содержащего вызов.
blockquote>РЕДАКТИРОВАТЬ: «Временная привязка ссылки ... сохраняется для срока службы ссылки». В этом случае время жизни ссылки заканчивается в конце выражения присваивания, равно как и время жизни временного целого.
Эта важная часть
Временная привязка ссылки
blockquote>В этом случае параметр привязан к временному, и будет уничтожен после вызова.
Вы не можете продлить время жизни, передав ссылку.
Это будет скомпилировано, но в итоге вы получите свисающую ссылку. param
освобождается после возвращения function
.
Если вы сделали его неконстантным, то он не был бы скомпилирован, потому что вы не можете передать не - ссылается на анонимный объект.
Из 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; поскольку он не ограничен временным.