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?