سؤال

واحدة من الميزات الجديدة الرائعة القادمة C++, C++0x ، هي "rvalue المراجع." وهو rvalue إشارة مماثلة lvalue (عادي) إشارة, إلا أنه يمكن أن يكون منضما إلى قيمة مؤقتة (عادة مؤقتة فقط يمكن أن تكون ملزمة const إشارة):

void FunctionWithLValueRef(int& a) {...}
void FunctionWithRValueRef(int&& a) {...}

int main() {
     FunctionWithLValueRef(5); // error, 5 is a temporary
     FunctionWithRValueRef(5); // okay
}

لماذا يخترع نوع جديد كليا بدلا من إزالة القيود المفروضة على العادي المراجع أن تسمح لها أن تكون ملزمة المؤقتات?

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

المحلول

فإنه سيكون عديم الجدوى.هل تغير شيء في وظيفة و تغيير سوف تفقد على الفور لأن الأمر كان في الواقع مؤقتة.

سبب نوع جديد ينبع من الحاجة إلى أن تكون قادرة على أن تقرر ما هو في الواقع rvalue وليس ما.عندها فقط يمكنك استخدامها في الواقع على الأشياء الرائعة التي يتم استخدامها.

string toupper(string && s) { // for nonconst rvalues
    for(char &c : s) make_uppercase(c);
    return move(s); // move s into a returned string object
}

string toupper(string const& s) { // for the rest
    // calls the rvalue reference version, by passing 
    // an rvalue copy.
    return toupper(string(s));
}

الآن, إذا كان لديك بعض rvalue ونقله إلى toupper ، rvalue مباشرة تعديلها ، لأننا نعلم المؤقتة هو رمي بعيدا الشيء على أي حال ، حتى نتمكن من aswell مجرد تغيير و لا تحتاج إلى نسخ.أيضا نفس الملاحظة يستخدم شيء يسمى التحرك المنشئات الخطوة المهمة.الجانب الأيمن هو لا نسخ ، ولكن الأشياء المسروقة بعيدا وانتقل إلى *this.

إذا كنت أقول أن rvalues يمكن ربط غير const lvalue المراجع ، ثم سيكون لديك أي وسيلة لمعرفة ما إذا كانت تلك المراجع وهو lvalue (اسمه كائن) أو rvalue (مؤقتة) في نهاية المطاف.


ربما أكثر قليلا أعلم ولكن مفيدة على أية حال, يمكنك وضع lvalue أو rvalue ref-تصفيات على وظيفة عضو.هنا مثال ، الذي يمتد بشكل طبيعي القائمة دلالات rvalue إشارات ضمنية معلمة الكائن:

struct string {
    string& operator=(string const& other) & { /* ... */ }
};

الآن لا يمكنك بعد الآن أقول

string() = "hello";

وهو الخلط وليس حقا جعل المعنى أكثر من مرة.ما & أعلاه لا يقول أن عامل التعيين يمكن أن يكون إلا الاحتجاج على lvalues.نفس يمكن القيام به من أجل rvalues ، عن طريق وضع &&.

نصائح أخرى

ولأن إضافة نوع جديد من إشارة تسمح لك لإرسال اثنين الزائدة من طريقة:

void CopyFrom(MyClass &&c)
{
    dataMember.swap(c);
}

void CopyFrom(const MyClass &c)
{
    dataMember.copyTheHardWay(c);
}

ويسمح الإصدار الذي يقبل نوع جديد من إشارة لتعديل متغير التي تتلقاها، لأن هذا المتغير لن يتم استخدامها في أي مكان آخر. لذلك يمكن أن "سرقة" محتويات منه.

وهذا هو السبب كله تم إضافة هذه الميزة. أن الإبقاء على نوع واحد من إشارة لا يحقق الهدف المنشود.

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