2016-07-12 3 views
0

Étant donné une struct:struct simples avec make_unique et emplace_back

struct S { 
    int x; 
    int y; 
} 

Pourquoi la norme nous permet de le faire:

std::vector<S> vec; 
vec.emplace_back(1, 2); 

mais ne permet pas de le faire:

auto ptr = std::make_unique<S>(1, 2); 

?

+1

Fonctionne bien avec moi http://coliru.stacked-crooked.com/a/7c54feda67017bf1 (J'ai dû ajouter un constructeur à la structure, mais c'est tout) – Pumkko

+3

Non, les deux sont [non autorisés] (http://rextester.com/WBNIK94302). Si vous fournissez un ctor ('S :: S (int, int)'), les deux sont [fine] (http://rextester.com/UHFEW17433). – songyuanyao

+0

@Pumkko Je voulais dire exactement struct simple sans ctor :) – vladon

Répondre

4

Veuillez vérifier votre code.

En cpp14 votre code exemple ne compile pas: https://ideone.com/ewyHW6

Les deux make_unique et emplace_back utilisent std::forward<Args>(args)... en arrière-plan, donc soit les deux ou aucun compile.

+0

désolé, ma faute ( – vladon

+0

@vladon personne n'est parfait.Les erreurs se produisent :-) – paweldac

1

En fait, aucun des deux ne fonctionne.

Il a été décidé que les fonctions de construction de type emplace en C++ std seraient construites avec () et non {} s. Il n'y a pas forte raison pour laquelle cela a été choisi (que je connais).

emplace_alt SND make_unique_alt pourrait être ajouté à std où il construit à l'aide {} à la place. (un meilleur nom devrait être choisi, naturellement)

Donc la réponse courte est "parce que std le dit". La réponse moyenne est "c'est un choix quasi arbitraire fait par std, suivi ailleurs pour être cohérent". La réponse longue impliquerait d'être dans la pièce où c'est arrivé et où elle a été revisitée: ce n'est pas une réponse longue.