Ответ 1
Возвращаемое временное время уничтожается сразу же после завершения полного выражения, за исключением того, что его время жизни расширяется за счет привязки к значению rvalue или const lvalue.
Вопрос: Является ли проигнорированное возвращаемое значение разрушенным немедленно или в момент выхода из области видимости.?
Ниже приведен код для моего компилятора
Вывод:
Кто это делает, не нуждается в этом.
Кто покупает его, не имеет никакого смысла.
Кто его использует, он не видит и не чувствует.
Что это?
Поэтому игнорируемое значение немедленно разрушается. Но является ли этот компилятор конкретным или стандартным поведением?
struct foo
{
~foo()
{
std::cout << "Who makes it, has no need of it. \n"
<< "Who buys it, has no use for it. \n";
}
}
foo createFoo()
{
return foo();
}
int main(int argc, char* argv[])
{
createFoo();
std::cout << "Who uses it can neither see nor feel it.\n"
<< "What is it?";
}
Возвращаемое временное время уничтожается сразу же после завершения полного выражения, за исключением того, что его время жизни расширяется за счет привязки к значению rvalue или const lvalue.
В стандарте 5.11 есть
В некоторых контекстах выражение появляется только для его побочных эффектов. Такое выражение называется отброшенным значением выражение. Выражение оценивается и его значение отбрасывается.
Итак, когда выражение заканчивается, значение затем отбрасывается и, если это тип класса, вызывается деструктор.
Временные объекты уничтожаются как последний шаг при оценке полного выражения (1.9), который (лексически) содержит точку, в которой они были созданы. Это справедливо, даже если эта оценка заканчивается выбросом исключения. Вычисления стоимости и побочные эффекты разрушения временный объект связан только с полным выражением, а не с каким-либо конкретным подвыражением.
Исключения для аргументов конструктора и привязки ссылок на временные. (§12.3/4f.)