c++ `कास्ट टी एंड` कांस्टेबल क्यों नहीं है?




templates const (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& क्यों नहीं है?

https://code.i-harness.com


मुझे पता है कि पहले से ही एक स्वीकृत उत्तर है जो सही है, लेकिन इसे थोड़ा सा जोड़ना है, यहां तक ​​कि टेम्पलेट्स के दायरे से बाहर और सामान्य रूप से केवल फ़ंक्शन घोषणाओं में ...

( const T& ) 

के रूप में ही नहीं है

( const T )

आपके उदाहरण में, जो पहले से मेल खाता है, आपके पास एक कास्ट संदर्भ है। यदि आप वास्तव में एक कास्ट वैल्यू चाहते हैं जो कि परिवर्तनीय नहीं है तो संदर्भ को दूसरे उदाहरण की तरह हटा दें।


ढहने और संदर्भ में आपका स्वागत है। जब आपके पास const T& , तो संदर्भ T लागू हो जाता है, और इसी प्रकार यह const । आप जैसे g कहते हैं

g<int&>(n);

इसलिए आपने निर्दिष्ट किया है कि T एक int& । जब हम एक संदर्भ संदर्भ को लागू करते हैं, तो दो संदर्भ एक ही के लिए ढह जाते हैं, इसलिए int& & बस int& बन जाता है। फिर हम [dcl.ref]/1 से नियम प्राप्त करते हैं, जिसमें कहा गया है कि यदि आप किसी संदर्भ में इसे लागू करते हैं तो इसे छोड़ दिया जाता है, इसलिए int& const बस int& बन जाता है (ध्यान दें कि आप वास्तव में int& const घोषणा नहीं कर सकते, यह है एक टाइपडिफ या टेम्पलेट से आते हैं)। इसका मतलब है कि

g<int&>(n);

आप वास्तव में बुला रहे हैं

void f(int& a, int& b)

और आप वास्तव में एक स्थिर संशोधन नहीं कर रहे हैं।

क्या आपने g को बुलाया था?

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

तब T int होगा, और f रूप में मुहर लगाई जाएगी

void f(int a, const int& b)

चूंकि T अब एक संदर्भ नहीं है, इसलिए const और & उस पर लागू हो जाता है, और आपको एक निरंतर चर को संशोधित करने की कोशिश करने के लिए एक कंपाइलर त्रुटि मिली होगी।





const-reference