سؤال

هل من الممكن تغيير مؤقت موضوع لتمرير أنها حجة ؟

struct Foo {    
   Foo& ref() { return *this; }
   Foo& operator--() { /*do something*/; return *this; }
   // another members
};
Foo getfoo() { return Foo(); } // return Foo() for example or something else
void func_val(Foo x) {}
void func_ref(const Foo & x) {}

int main() {
   func_val(--getfoo());     // #1 OK?
   func_ref(getfoo());       // #2 OK?
   func_ref(getfoo().ref()); // #3 OK?
   // the following line is a real example 
   //    using --vector.end() instead of --getfoo()
   func_ref(--getfoo());     // #4 OK? 

   const Foo & xref = --getfoo(); //  Does const extend the lifetime ?
   func_ref(xref);     // #5 OK? 
   func_val(xref);     // #6 OK? 

}

ومن المعروف أن تعيين كائن مؤقت إلى const الإشارة يمتد عمر هذا كائن مؤقت.و ماذا عن #4 و #5 أسطر من التعليمات البرمجية ؟ هل صحيح أن المرجعية x هو دائما صالحة في وظيفة func_ref?الشيء هو أن المشغل-- ترجع بعض المراجع و المترجم لا يرى أي علاقة بين هذه المرجعية المؤقتة خلقنا.

هل كانت مفيدة؟

المحلول

func_val(--getfoo());     // #1 OK?

نعم, موافق.على operator-- عضو وظيفة ، وهو ما يسمى ، والتي ترجع نفسها (و lvalue يشير إلى نفسه).الكائن ثم نسخها إلى المعلمة func_val.لاحظ أن قيمة العائد الأمثل هو لا يسمح لتطبيق منذ المؤقتة التي تم إنشاؤها من قبل getfoo() كان في السابق لا بد أن مرجع.

func_ref(getfoo());       // #2 OK?

نعم, موافق.الدعوة getfoo() ترجع المؤقتة التي لا بد أن const المرجعية.نسخة منشئ هو مطلوب ، ولكن ذلك قد يكون الأمثل للخروج من التنفيذ.المؤقتة التي استمرت حتى نهاية الكامل التعبير التي تحتوي على الدعوة إلى func_ref (كل تعبير البيان هنا).

func_ref(getfoo().ref());

نعم, موافق.لا نسخ منشئ المطلوبة ، كما ربط const مرجع غير مؤقتة بل lvalue تمثل الكائن نفسه.

// the following line is a real example 
//    using --vector.end() instead of --getfoo()

لا يشترط العمل.التفكير في الحالة التي تكون فيها vector.end() ترجع T* (يسمح).لا يسمح لك تعديل rvalues من غير نوع الطبقة ، حتى في هذه الحالة سيكون غير تشكيلها.

func_ref(--getfoo()); 

نعم, موافق.الحجة التي يتم تقييمها في #1, لكن الناتجة lvalue مباشرة مرت من const مرجع لا بد منه.في هذا المعنى انها تساوي #3 (باستثناء إنقاص الآثار الجانبية).

const Foo & xref = --getfoo();

معيار الصياغة ليست واضحة تماما.فإنه بالتأكيد تعتزم فقط إطالة عمر الكائنات لم تلتزم بالإشارة.ولكن في حالتنا ، --getfoo() ينتج أحد lvalue يشير إلى كائن مؤقت الذي كان سابقا لا بد أن مرجع.قد يكون من المفيد تقديم عيب التقرير إلى اللجنة (أنا أيضا قد غاب عن الصيغة التي يتطلب كائن مؤقت أن لا يكون يحدها إشارة حتى الآن).

في أي حال ، فإن المقصود من سلوك التدمير المؤقتة التي تنتج من getfoo() في نهاية تهيئة xref, لذا xref سوف تصبح التعلق المرجعية.

الشيء هو أن المشغل-- ترجع بعض المراجع و المترجم لا يرى أي علاقة بين هذه المرجعية المؤقتة خلقنا.

بالضبط (لكن لا ينطبق إلا على تهيئة xref والتي سوف تذهب جنون.في جميع الحالات الأخرى ، المقصود السلوك تريد (أو ما أعتقد أنك تريد أن يتحقق)).

نصائح أخرى

يعيش المنشئون دائمًا طوال العمر ممتلىء التعبير الذي تم إنشاؤه على أي حال. وبالتالي ، في بيان التعبير func_val(--getfoo());, ، حياة المؤقتة التي تم إرجاعها من قبل getfoo() التعبير لا يحتاج إلى أي امتداد. البيان لا ينتهي حتى بعد ذلك func_val() عاد.

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