c++ - لماذا يكون "const T &` غير متأكد من كونه const؟




templates function-templates (2)

template<typename T>
void f(T a, const T& b)
{
    ++a; // ok
    ++b; // also ok!
}

template<typename T>
void g(T n)
{
    f<T>(n, n);
}

int main()
{
    int n{};
    g<int&>(n);
}

يرجى ملاحظة: b من const T& و ++b ما يرام!

لماذا هو const T& لست متأكدا من أن تكون const؟


أعلم أن هناك بالفعل إجابة مقبولة وصحيحة ولكن فقط لإضافتها قليلاً ، حتى خارج نطاق النماذج وفقط في إعلانات الوظائف بشكل عام ...

( const T& ) 

ليس هو نفسه كما

( const T )

في المثال الذي يطابق الأول ، لديك مرجع const. إذا كنت تريد حقًا قيمة const غير قابلة للتعديل ، فقم بإزالة المرجع كما في المثال الثاني.


مرحبا بكم في const والمراجع الانهيار . عندما يكون لديك const T& ، يتم تطبيق المرجع على T ، وكذلك الحال مع const . قمت بالاتصال g مثل

g<int&>(n);

لذلك حددت أن T هو int& . عندما نطبق إشارة إلى مرجع القيمة ، ينقسم المرجعان إلى مرجع واحد ، لذلك يصبح int& & مجرد int& . بعد ذلك نصل إلى القاعدة من [dcl.ref]/1 ، والتي تنص على أنه إذا قمت بتطبيق const على مرجع يتم تجاهله ، لذلك تصبح int& int& const مجرد int& (لاحظ أنه لا يمكنك التصريح عن int& const فعليًا ، تأتي من typedef أو قالب). هذا يعني ل

g<int&>(n);

انت فعلا تدعو

void f(int& a, int& b)

وأنت لا تقوم بالفعل بتعديل ثابت.

هل اتصلت بـ g as

g<int>(n);
// or just
g(n);

ثم T سيكون int ، و f قد تم ختمها كـ

void f(int a, const int& b)

نظرًا لأن T لم يعد مرجعًا ، فقد تم تطبيق const و & get عليه ، وكنت قد تلقيت خطأ في برنامج التحويل البرمجي لمحاولة تعديل متغير ثابت.





const-reference