De retour unique_ptr de fonctions

unique_ptr<T> ne permet pas la copie de la construction, au lieu de cela il prend en charge la sémantique de déplacement. Pourtant, je peux retourner un unique_ptr<T> à partir d'une fonction et d'attribuer la valeur renvoyé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 est-ce que la ligne de 1 ne pas invoquer le constructeur de copie et entraîner des erreurs de compilation? Si je devais utiliser la ligne 2 au lieu de cela, il avait un sens (à l'aide de la ligne de 2 fonctionne aussi bien, mais nous ne sommes pas tenus de le faire).

Je sais C++0x permet à cette exception à unique_ptr depuis la valeur de retour est un objet temporaire qui sera détruit dès que la fonction se termine, ainsi, de garantir l'unicité de le pointeur retourné. Je suis curieux de savoir comment cela est mis en œuvre, est-il spécial enfermé dans le compilateur ou est-il un autre clause dans la spécification du langage que ce exploits?

  • Hypothétiquement, si vous étiez à la mise en œuvre d'une méthode de fabrique, préférez-vous 1 ou 2 pour le retour de l'usine de sortie? Je présume que ce serait l'utilisation la plus courante de 1 parce que, avec une bonne usine, vous voulez vraiment la propriété de l'construits chose à transmettre à l'appelant.
  • Ils ont tous deux de transmettre la propriété de la unique_ptr. Toute la question est de environ 1 et 2 sont deux façons différentes de réaliser la même chose.
  • dans ce cas, la RVO prend place dans c++0x ainsi, la destruction de l'unique objet sera une fois qui est effectuée après main fonction se termine , mais pas quand la foo sorties.
InformationsquelleAutor Praetorian | 2010-11-30