سؤال

لقد رأيت في أنوزر هناك:يعود بمرجع رفالو أكثر كفاءة?

تعريف وظيفة العضو:

Beta_ab const& getAB() const& { return ab; }

أنا على دراية السيرة الذاتية-التصفيات (const) على وظائف الأعضاء ، ولكن ليس const&.

ماذا يفعل الأخير const& يعني?

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

المحلول

ال & هو المرجع-التصفيات.المرجع-التصفيات هي جديدة في 11 C ج وغير معتمدة حتى الآن في جميع المجمعين ، لذلك كنت لا ترى لهم في كثير من الأحيان حاليا.وهي تحدد أنه لا يمكن استدعاء هذه الوظيفة إلا على القيم (وليس على القيم):

#include <iostream>

class kitten
{
private:
    int mood = 0;

public:
    void pet() &
    {
        mood += 1;
    }
};

int main()
{
    kitten cat{};
    cat.pet(); // ok

    kitten{}.pet(); // not ok: cannot pet a temporary kitten
}

جنبا إلى جنب مع السيرة الذاتية المؤهلة const, ، فهذا يعني أنه يمكنك فقط استدعاء وظيفة العضو هذه على لفالويس ، وقد تكون تلك كونست.

نصائح أخرى

نحن نعلم ذلك في هذا الرمز...

Beta_ab const& getAB() const { return ab; }
                       ^^^^^

أبرز const يعني أنه يمكن استدعاء وظيفة العضو على أ const كائن.يمكن دائما استدعاء وظيفة العضو على غير-const كائن بغض النظر عن وظيفة السيرة الذاتية التأهيل.

لذلك في هذا الرمز...

Beta_ab const& getAB() const & { return ab; }
                             ^

يجب أن نتوقع أن أبرز & يقول أيضا شيئا عن أنواع الكائنات التي يسمح باستدعاء وظيفة العضو هذه.سنكون على صواب;في 11 دولارا أمريكيا ، يشير هذا إلى أنه لا يجوز استدعاء وظيفة العضو إلا للقيم.

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }

في المثال أعلاه ، يتم استدعاء الحمل الزائد الأول على القيم ، ويتم استدعاء الحمل الزائد الثاني على غير-const القيم.على غرار المثال الأكثر شيوعا التالي ، مع تطبيق المؤهلات على معلمات الوظيفة العادية:

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }

إنه يعمل بشكل مختلف قليلا بالنسبة للمعلمات العادية ، كما في هذا المثال ، فإن الحمل الزائد الأول سيقبل قيمة إذا تمت إزالة الحمل الزائد الثاني.

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