2016-07-10 12 views
0

Ich versuche zu const_cast unique_ptr und es gibt mir Fehler:Warum const_cast ist für unique_ptr nicht erlaubt?

const std::unique_ptr<int> myptr; 
    std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int> >(myptr)); 

Deshalb möchte ich verstehen, warum const_cast nicht mit unique_ptr funktioniert, wenn es mit dem normalen Zeiger arbeiten können?

+2

Natürlich können Sie nicht von einem const Objekt bewegen: move muss die Quelle ändern, um Ressourcen von ihm zu "stehlen". –

+0

also das bedeutet ich kann nicht Vektor const std :: unique_ptr richtig? – Kapil

+1

Ich bin mir ziemlich sicher, dass Sie das nicht können. Vektorelemente müssen entweder kopierbar oder beweglich sein und 'const unique_ptr' ist keines davon. –

Antwort

3

Sie können const einen unique_ptr einwerfen. Was Sie nicht tun können, ist von const unique_ptr zu gehen, was Ihr Code versucht zu tun. Sie könnten dies jedoch tun:

vec.push_back(std::move(const_cast<std::unique_ptr<int>&>(myptr))); 

Natürlich ist dies ein undefiniertes Verhalten, da Ihre unique_ptr eigentlich const ist. Wenn myptr stattdessen eine const-Referenz zu einem unique_ptr wäre, das eigentlich nicht const wäre, wäre das obige sicher.

In Ihrem neuen Code

std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int> >(myptr)); 

Die konst Guss versucht myptr, bevor er das Ergebnis std::move zu kopieren. Sie müssen es in eine Referenz umwandeln, um es nicht zu kopieren.

+1

@Kapil: Ja. Wir können. Was Sie nicht tun können, ist ein unique_ptr zu kopieren, was Ihr neuer Code versucht. –

+0

nein sogar diese std :: unique_ptr myptr1 = std :: move (const_cast > (myptr)); kompiliert nicht – Kapil

+1

@Kapil: Weil das immer noch versucht, die unique_ptr in der Const_cast selbst zu kopieren. Sie müssen es zu einer Referenz umwandeln. –

Verwandte Themen