تعطيل خصم وسيطة القالب باستخدام std::forward لضمان إعادة التوجيه الصحيح
خذ بعين الاعتبار تعريف std::forward في VS2010:
template inline
_Ty&& forward(typename identity<_Ty>::type& _Arg)
{ // forward _Arg, given explicitly specified type parameter
return ((_Ty&&)_Arg);
}
الغرض من قالب الهوية هو تعطيل خصم وسيطة القالب. لماذا يعتبر هذا الأمر بالغ الأهمية في هذا السيناريو؟
قد يؤدي خصم وسيطة القالب إلى خصم نوع غير صحيح. إذا تم تمرير مرجع قيمة r لكائن من النوع X إلى دالة قالب بنوع معلمة T&، فإن خصم وسيطة القالب سيستنتج T كـ X، مما يؤدي إلى نوع معلمة X&. ومع ذلك، من أجل إعادة التوجيه بشكل مثالي، تكون المعلمة ذات قيمة لأنها تحمل اسمًا. لذلك، فإن استخدام خصم وسيطة القالب في std::forward قد يتسبب في أن يكون نوع المعلمة المستنتجة مرجعًا للقيمة أو مرجعًا للقيمة الثابتة.
template
T&& forward_with_deduction(T&& obj)
{
return static_castفكر في المثال التالي:
void test(int&){}
void test(const int&){}
void test(int&&){}
template
void perfect_forwarder(T&& obj)
{
test(forward_with_deduction(obj));
}
int main()
{
int x;
const int& y(x);
int&& z = std::move(x);
test(forward_with_deduction(7)); // 7 is an int&&, correctly calls test(int&&)
test(forward_with_deduction(z)); // z is treated as an int&, calls test(int&)
// All the below call test(int&) or test(const int&) because in perfect_forwarder 'obj' is treated as
// an int& or const int& (because it is named) so T in forward_with_deduction is deduced as int&
// or const int&. The T&& in static_cast<T&&>(obj) then collapses to int& or const int& - which is not what
// we want in the bottom two cases.
perfect_forwarder(x);
perfect_forwarder(y);
perfect_forwarder(std::move(x));
perfect_forwarder(std::move(y));
}
في هذا المثال، تفشل إعادة التوجيه المثالية نظرًا لأنه يتم التعامل مع المعلمة في Perfect_forwarder كمرجع lvalue أو const lvalue بسبب اسمها. يؤدي هذا إلى خصم نوع غير صحيح في Forward_with_deduction، مما يؤدي إلى دلالات static_cast غير مرغوب فيها.
يؤدي تعطيل خصم وسيطة القالب باستخدام قالب الهوية في std::forward إلى التأكد من أن std::forward يُرجع دائمًا مرجع rvalue، وهو أمر ضروري لـ تصحيح إعادة التوجيه المثالي للقيم lvalues وكذلك rvalues.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3