make_unique et de transfert parfait

Pourquoi n'est-il pas std::make_unique modèle de fonction dans la norme C++11 de la bibliothèque? Je trouve

std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));

un peu verbeux. Ne serait pas la suite être beaucoup plus agréable?

auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);

Ce masque la new bien et ne mentionne que le type une fois.

De toute façon, voici ma tentative de mise en œuvre de make_unique:

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

Il m'a fallu un certain temps pour obtenir le std::forward choses à compiler, mais je ne suis pas sûr si elle est correcte. S'agit-il? Qu'est-ce exactement ne std::forward<Args>(args)... veux dire? Que fait le compilateur de cette?

  • Assez sûr que nous avons eu cette discussion avant... notez également que unique_ptr prend un deuxième paramètre de modèle qui vous devez en quelque sorte permettre - c'est différent de shared_ptr.
  • Peut-être que c'est parce qu'il est plutôt facile d'écrire vous-même? Alors qu'un make_unique() simplement roulés un new déclaration, ce n'est pas comme make_shared() qui n'est pas trivial à mettre en œuvre correctement (il alloue de l'espace pour le compte de référence et l'objet en même temps). Mais bon question de bien.
  • Je ne pense pas qu'il serait judicieux de paramétrer make_unique avec une coutume deleter, parce qu'évidemment il alloue via un bon vieux new et doit donc utiliser un bon vieux delete 🙂
  • C'est vrai. Donc, le projet de make_unique serait limitée à new allocation... eh bien, c'est très bien si vous voulez écrire, mais je peux voir pourquoi quelque chose comme ça ne fait pas partie de la norme.
  • En fait, j'aime utiliser un make_unique modèle depuis le constructeur de std::unique_ptr est explicite, et donc il est détaillé au retour unique_ptr à partir d'une fonction. Aussi, je préfère utiliser auto p = make_unique<foo>(bar, baz) que std::unique_ptr<foo> p(new foo(bar, baz)).
  • Comme alternative, vous pouvez écrire p.reset( nouveau SomeUserDefinedType(1, 2, 3) );
  • make_unique est à venir dans C++14, voir isocpp.org/blog/2013/04/trip-report-iso-c-spring-2013-meeting

InformationsquelleAutor fredoverflow | 2011-08-12