Dans [except.ctor], la norme ( N4140 ) garantit que :
...les destructeurs sont invoqués pour tous les objets automatiques construits depuis que le bloc d'essai a été entré...
Cependant, dans l'exemple suivant, le vide sortie prouve que la valeur de retour de la fonction foo
n'est pas détruite, bien qu'elle ait été construite. Compilé en utilisant g++ (5.2.1) et clang++ (3.6.2-1) et avec les options -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 (...) { }
}
Est-ce un bogue à la fois dans g++ et clang++, ou les valeurs de retour des fonctions ne sont-elles pas ne sont pas considérées comme des objets automatiques, ou est-ce une faille dans le langage C++ ?
Dans aucun de [stmt.return], [expr.call] ou [dcl.fct] je n'ai pu trouver clairement si une valeur de retour de fonction est considérée comme un objet automatique. automatique. Les indications les plus proches que j'ai trouvées sont 6.3.3 p2 :
...Une déclaration de retour peut impliquer la construction et la copie ou le déplacement d'un objet temporaire...
et 5.2.2 p10 :
Un appel de fonction est une lvalue si le type de résultat est une lvalue. ou une référence rvalue au type de fonction, une xvalue si le type de résultat est un type rv. type de résultat est une référence rvalue au type d'objet, et une prvalue sinon.