unique_ptr<T>
ne permet pas la construction de copie, mais prend en charge la sémantique de déplacement. Pourtant, je peux retourner un à unique_ptr<T>
partir d'une fonction et affecter la valeur retournée à une variable.
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p( new int(10) );
return p; // 1
//return move( p ); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
Le code ci-dessus compile et fonctionne comme prévu. Alors, comment se fait-il que cette ligne 1
n'invoque pas le constructeur de copie et n'entraîne pas d'erreurs de compilation? Si je devais utiliser la ligne à la 2
place, cela aurait du sens (l'utilisation de la ligne 2
fonctionne également, mais nous ne sommes pas tenus de le faire).
Je sais que C ++ 0x autorise cette exception unique_ptr
car la valeur de retour est un objet temporaire qui sera détruit dès la sortie de la fonction, garantissant ainsi l'unicité du pointeur renvoyé. Je suis curieux de savoir comment cela est implémenté, est-il spécial dans le compilateur ou existe-t-il une autre clause dans la spécification de langage que cela exploite?
unique_ptr
. Toute la question porte sur 1 et 2 étant deux façons différentes de réaliser la même chose.
main
sortie de la fonction, mais pas au moment de la foo
sortie.