سؤال

في السؤال السابق, ، يبدو أن دالة الإرجاع حسب القيمة العادية تنسخ دائمًا دالة إرجاعها return الوسيطة في المتغير الذي تم تعيينه منه.

هل هذا مطلوب بموجب المعيار أم يمكن تحسين الوظيفة عن طريق إنشاء المتغير "المخصص لـ" حتى داخل نص الوظيفة؟

struct C { int i; double d; };

C f( int i, int d ) {
    return C(i,d); // construct _and_ copy-construct?
}

int main() {
    C c = f( 1, 2 ); 
}
هل كانت مفيدة؟

المحلول

يسمح المعيار بأي مستوى من حذف النسخ هنا:

  • قم بإنشاء مؤقت محلي، ثم قم بنسخه إلى قيمة إرجاع، ثم قم بنسخ إنشاء قيمة الإرجاع إلى "c" المحلي. أو
  • أنشئ مؤقتًا محليًا، ثم انسخه إلى "c". أو
  • إنشاء "c" باستخدام الوسيطات "i,d"

نصائح أخرى

والمعيار يقول أن منشئ نسخة ليس من الضروري أن تستخدم - انظر القسم 12.8 / 15:

<اقتباس فقرة>   

و15 عندما كائن فئة مؤقت   يتم نسخ باستخدام منشئ نسخة،   وهذا الكائن ونسخة لديهم   نفس السيرة الذاتية، غير مؤهلين نوع، ل   يسمح التنفيذ لعلاج   النص الأصلي ونسخة عن اثنين   طرق مختلفة للاشارة الى   نفس الكائن ويتم تنفيذ نسخة في   كل شيء، حتى لو كانت نسخة الطبقة   منشئ أو المدمر يكون الجانب   تأثيرات.

وأكثر من ذلك بكثير في سياق مماثل.

والطريق لا يمر المعلمة حسب المرجع وتعيين نتيجة لذلك؟

وهناك طريقة واحدة بسيطة جدا وجيدة لتجنب مثل هذه الاعتبارات تماما - يمكنك أن تنظر عودته دفعة :: shared_ptr إلى كائن تم إنشاؤه - سيكون عمليا نفسه عندما يتعلق الأمر سهولة الاستخدام ولكن بالتأكيد لن يتم نسخها وجوه الخاص بك دون داع - وسوف يكون ذلك صحيحا أيضا إذا كنت إعادته على الرغم من طبقات عدة مكالمات الدالة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top