Avatar ·

Warum kann man std::unique_ptr ohne std::move aus einer Funktion zurückgeben?

Hallo! Ich habe vor kurzem angefangen, C++11 und Smart Pointer zu lernen, und bin bei std::unique_ptr auf Verwirrung gestoßen. Ich weiß, dass unique_ptr nicht kopiert werden kann – nur verschoben. Zum Verschieben wird normalerweise std::move() verwendet. Aber mir ist ein seltsames Verhalten aufgefallen: Wenn ich eine Funktion schreibe, die einen unique_ptr erstellt und zurückgibt, beschwert sich der Compiler nicht, selbst wenn ich std::move() nicht aufrufe. Hier ist ein Beispiel: ```cpp #include std::unique_ptr createInt() { std::unique_ptr ptr = std::make_unique(42); return ptr; // Ohne std::move() – und es funktioniert! } int main() { std::unique_ptr p = createInt(); return 0; } ``` Warum wird das kompiliert? Schließlich verbietet unique_ptr das Kopieren! Wenn ich dasselbe mit einer normalen Variable in einer anderen Funktion versuche, zum Beispiel: ```cpp void test() { std::unique_ptr a = std::make_unique(10); std::unique_ptr b = a; // Fehler! Kopieren ist verboten. } ``` – wird das nicht kompiliert. Was ist der Unterschied?