Заявление, которое не является полным выражением

Часто можно услышать, что в C++ временные объекты деконструируются в конце полного выражения. Полное выражение определяется как выражение, которое не является подвыражением какого-либо другого выражения. Для меня это звучит очень похоже на понятие утверждения.

Итак, мои вопросы: если я добавлю точку с запятой к полному выражению, всегда ли это будет инструкция? Можно ли получить каждое полное выражение, взяв некоторый оператор с точкой с запятой в конце и удалив эту точку с запятой? Могу ли я предположить, что каждый временный объект будет жить до конца своего оператора?


person Toby Brull    schedule 28.02.2017    source источник


Ответы (1)


Вот оператор, который длиннее, чем время жизни содержащегося временного файла:

if (T() == T())
  foo();

Два временных объекта, созданных выражением в условии, уничтожаются в конце полного выражения и перестают существовать при выполнении оператора (foo();).

Обратите внимание, что для любого выражения e e; является оператором (а именно оператором-выражением, см. [stmt.expr]).

person Kerrek SB    schedule 28.02.2017
comment
Хм, интересно. А как же первые два вопроса? Существуют ли примеры, в которых нет составных операторов? - person Toby Brull; 28.02.2017
comment
@TobiasBrüll: Обновлено. - person Kerrek SB; 28.02.2017
comment
Ой, вы только что удалили фигурные скобки! Хотя, возможно, это технически правильно, я не это имел в виду. :) - person Toby Brull; 28.02.2017
comment
@TobiasBrüll: Пожалуйста, спросите, что вы имеете в виду :-) - person Kerrek SB; 28.02.2017
comment
@KerrekSB Можете ли вы что-нибудь связать с двумя другими вопросами? Если я добавлю точку с запятой к полному выражению, будет ли это... - person Toby Brull; 01.03.2017
comment
@TobiasBrüll: Вопрос немного странный. Если бы вы буквально просто добавили точку с запятой к полному выражению, вы, вероятно, получили бы синтаксическую ошибку. Но на самом деле для любого выражения e, e; является оператором [stmt.expr]. - person Kerrek SB; 01.03.2017