2 Stimmen

Korrekte Kopiersemantik für std::unique_ptr als Parameter

Gibt es eine Änderung der Schnittstelle, mit der der zweite Aufruf funktionieren kann?

Oder soll ich alles so lassen, wie es ist?

Ich vermute, dass die zusätzliche Konstruktion im ersten Fall absichtlich so gestaltet wurde, damit klar ist, dass das Eigentum übertragen wird.

#include <memory>

struct Bar { };
typedef std::unique_ptr<Bar> UPBar;

void foo1( UPBar p ) {  }
void foo2( UPBar p ) { foo1( move( p )); }
void foo3( UPBar p ) { foo2( move( p )); }
void foo4( UPBar p ) { foo3( move( p )); }

int main(int argc, char** argv)
{
    UPBar p( new Bar );
    foo4( move( p ));  // ok, but requires an extra construction vs line below
    foo4( new Bar );   // fails: any modification to get this to work?

    return 0;
}

Zweite Frage: Wenn ich alle Parameter ändere, die an RValue-References (&&) übergeben werden, hat das irgendwelche Nachteile? Sollte ich in der Tat sicherstellen, dass alle meine std::unique_ptr<> Parameter von RValue-References übergeben werden?

2voto

R. Martinho Fernandes Punkte 217895

Sie können die unique_ptr als vorübergehend:

foo4( UPBar( new Bar ));

Sie können auch eine make_unique Funktionsvorlage, ähnlich wie bei der make_shared die es für shared_ptr :

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

foo4( make_unique<Bar>() );
// other constructors are also callable:
foo4( make_unique<Bar>(x, y, z) );

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X