Я читал подраздел 18.2. Конструкторы и деструкторы раздела 18, обработка исключений в C ++ 17, стандартный черновик , где есть пример (стр. 384). Я пытался понять, где происходит уничтожение объекта A, возвращенного внутри блока try, но не смог найти. Поэтому я скопировал пример, добавил несколько отпечатков и увидел, что dtor этого объекта никогда не вызывается. Что мне здесь не хватает? Кто-нибудь, пожалуйста, объясните, что здесь происходит.
#include <stdio.h>
struct A {
int a_;
explicit A(int a):a_(a) {
printf("A(%d)'s ctor\n", a_);
}
~A() {
printf("A(%d)'s dtor\n", a_);
}
};
struct Y { ~Y() noexcept(false) {
printf("y's dtor\n");
throw 0; } };
A f() {
try {
A a(23);
Y y;
A b(56);
return A(100); // #1 who destructs this ??
} catch (...) {
printf("handling exception..\n");
}
printf("At line %d now..\n", __LINE__);
return A(200); // #2
}
int main() {
auto ret = f();
printf("f returned A(%d) object\n", ret.a_);
return 0;
}
Над кодом выводится следующее:
A(23)'s ctor
A(56)'s ctor
A(100)'s ctor
A(56)'s dtor
y's dtor
A(23)'s dtor
handling exception..
At line 34 now..
A(200)'s ctor
f returned A(200) object
A(200)'s dtor
...Program finished with exit code 0