Je suis un peu confus au sujet des nouvelles règles concernant l'élision de la copie et je ne suis même pas sûr qu'elles s'appliquent dans ce cas. J'ai ceci :
template <typename T> struct foo {
T t;
foo(const T& t) : t(t) {}
~foo() { std::cout << "destructor \n"; }
}
template <typename T> foo<T> make_foo(const T& t) { return {t}; }
donde make_foo
est seulement pour permettre de déduire le paramètre (dans le code réel t
est un lambda, mais je l'ai laissé ici par souci de simplicité, ou plutôt par souci de confusion, désolé pour cela) comme dans
auto x = make_foo(123);
Maintenant, j'ai besoin d'être absolument sûr que foo
est appelé exactement une fois : lorsque x
sort du champ d'application. Je crains que cette question ne soit pas très claire, mais s'il est si évident qu'il n'y aura pas d'interruption temporaire de l'activité de l'entreprise, je ne vois pas pourquoi. foo
ce serait une réponse suffisante ;).
En C++11, puis-je être certain qu'il n'y aura pas d'erreur d'affichage temporaire ? foo
en make_foo
qui seront détruites ? Le destructeur ne doit être appelé que lorsque x
sort du champ d'application.
Comme cela a été correctement souligné dans un commentaire, cette question est la partie Y d'une question XY et la partie X est que je veux mettre en œuvre une fonctionnalité de fin de portée. Le destructeur de foo
a des effets secondaires (dans l'exemple, le cout
) qui doit être appelé à la fin de la portée de l'élément x
mais pas dans make_foo
au cas où il y aurait un problème temporaire foo
.