Avatar ·

لماذا يمكن إرجاع std::unique_ptr من دالة بدون std::move؟

مرحباً! لقد بدأت مؤخراً في تعلم C++11 والمؤشرات الذكية، ولدي بعض الالتباس بخصوص std::unique_ptr. أعلم أن unique_ptr لا يمكن نسخه - فقط نقله. للنقل عادةً ما يتم استخدام std::move(). لكني لاحظت سلوكاً غريباً: عندما أكتب دالة تقوم بإنشاء وإرجاع unique_ptr، لا يشتكي المترجم حتى لو لم أقم باستدعاء std::move().\n\nهذا مثال:\n\n```cpp\n#include \n\nstd::unique_ptr createInt() {\n std::unique_ptr ptr = std::make_unique(42);\n return ptr; // بدون std::move() - وهذا يعمل!\n}\n\nint main() {\n std::unique_ptr p = createInt();\n return 0;\n}\n```\n\nلماذا يتم تجميع هذا الكود؟ ففي النهاية unique_ptr يمنع النسخ! إذا حاولت فعل نفس الشيء مع متغير عادي في دالة أخرى، على سبيل المثال...