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 verwirrt. 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, meckert der Compiler nicht, selbst wenn ich std::move() nicht aufrufe.\n\nHier ist ein Beispiel:\n\n```cpp\n#include \n\nstd::unique_ptr createInt() {\n std::unique_ptr ptr = std::make_unique(42);\n return ptr; // Ohne std::move() – und es funktioniert!\n}\n\nint main() {\n std::unique_ptr p = createInt();\n return 0;\n}\n```\n\nWarum wird das kompiliert? Schließlich verbietet unique_ptr das Kopieren! Wenn ich das Gleiche mit einer normalen Variable in einer anderen Funktion versuche, zum Beispiel