2016-07-12 18 views
0

Bei einer Struktur:einfache Strukturen mit make_unique und emplace_back

struct S { 
    int x; 
    int y; 
} 

Warum die Norm uns, dies zu tun erlaubt:

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

aber nicht erlaubt, dies zu tun:

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

?

+1

Funktioniert gut mit mir http://coliru.stacked-crooked.com/a/7c54feda67017bf1 (I auf die Struktur einen Konstruktor hinzuzufügen hatte, aber das ist alles) – Pumkko

+3

Nein, beide [nicht erlaubt] (http://rextester.com/WBNIK94302). Wenn Sie einen ctor ('S :: S (int, int)') angeben, dann sind beide [in Ordnung] (http://rextester.com/UHWEW17433). – songyuanyao

+0

@Pumkko ich meinte genau einfache Struktur ohne ctor :) – vladon

Antwort

4

Bitte überprüfen Sie Ihren Code.

In cpp14 Ihr Beispiel-Code lässt sich nicht kompilieren: https://ideone.com/ewyHW6

Beide make_unique und emplace_back verwenden std::forward<Args>(args)... im Hintergrund, also entweder beide oder keiner kompiliert.

+0

Entschuldigung, meine Schuld ( – vladon

+0

@ Vladon niemand ist perfekt. Fehler passieren :-) – paweldac

1

Eigentlich funktionieren beide nicht.

Es wurde entschieden, dass emplace-artige Konstruktfunktionen in C++ std mit () s nicht {} s aufbauen würden. Es gibt keinen starken Grund, warum das gewählt wurde (das weiß ich).

emplace_alt snd make_unique_alt könnte std hinzugefügt werden, wo es {} stattdessen Konstrukte verwenden. (ein besserer Name sollte natürlich gewählt werden)

Also die kurze Antwort ist "weil std so sagt". Die mittlere Antwort lautet: "Es ist eine fast beliebige Wahl, die von std gemacht wurde, gefolgt von anderen, um konsistent zu sein". Die lange Antwort würde beinhalten, in dem Raum zu sein, in dem es passiert ist und wo es wieder besucht wurde: das ist keine lange Antwort.