В [except.ctor] стандарт (N4140) гарантирует, что:
... деструкторы вызываются для все автоматические объекты, созданные с блока try поступил...
Однако в следующем примере пустой output доказывает, что возвращаемое значение функции foo
не разрушено, хотя оно было построено, Скомпилирован с использованием g++ (5.2.1) и clang++ (3.6.2-1) и с опциями -O0 -fno-elide-constructors -std=c++14
.
struct A { ~A() { cout << "~A\n"; } };
struct B { ~B() noexcept(false) { throw 0; } };
A foo() {
B b;
return {};
}
int main() {
try { foo(); }
catch (...) { }
}
Является ли это ошибкой как в g++, так и в clang++, или являются возвращаемыми значениями функции считаются автоматическими объектами, или это петлевое отверстие на языке С++?
Ни в одном из [stmt.return], [expr.call] или [dcl.fct] я не смог найти ясное утверждение, является ли возвращаемое значение функции автоматическим объект. Ближайшие намеки, которые я нашел, - 6.3.3 p2:
... Оператор возврата может включать строительство и копирование или перемещение временного объекта...
и 5.2.2 p10:
Вызов функции - это lvalue, если тип результата равен lvalue ссылочный тип или ссылочный номер rvalue для типа функции, значение x, если result type - это ссылка rvalue на тип объекта и в противном случае значение prvalue.