2016-07-14 32 views
12

एक अग्रेषण संदर्भ तर्क के साथ निम्न टेम्पलेट समारोह इंटरफेस पर विचार करें:अग्रेषण संदर्भ की स्थिरता कैसे व्यक्त करें?

template<typename T> 
void f(T&& t) { ... } 

इस मामले में, f या तो f के लिए तर्क के प्रकार पर निर्भर एक lvalue संदर्भ, या एक rvalue संदर्भ लेता है,। मैं कैसे व्यक्त कर सकता हूं कि f इसके पैरामीटर को संशोधित नहीं करता है? निम्नलिखित अनुभवहीन दृष्टिकोण काम नहीं करता है, के बाद से यह अब f को lvalue संदर्भ गुजर की अनुमति देता है:

template<typename T> 
void f(const T&& t) { ... } 
+0

कोई 'एफ' नहीं है। –

उत्तर

34

मुझे लगता है कि च अपने पैरामीटर संशोधित नहीं करता है कैसे व्यक्त कर सकते हैं?

यदि फ़ंक्शन इसके पैरामीटर को संशोधित नहीं करता है तो अग्रेषण संदर्भ का उपयोग करने के लिए कोई लाभ नहीं होता है। जब आप अग्रेषित किसी अन्य फ़ंक्शन पर पैरामीटर चाहते हैं तो आप एक अग्रेषण संदर्भ का उपयोग करते हैं, जो परवाह करता है कि तर्क एक लवल्यू या रावल्यू है (क्योंकि शायद अंतराल और रावल्यू के लिए अलग ओवरलोड हैं, और रावल्यू अधिक कुशल हो सकता है)।

यदि आपका फ़ंक्शन तर्क को संशोधित नहीं करता है तो उसे देखभाल करने की आवश्यकता नहीं है कि उसके पास कोई लालसा या रैवल्यू है, तो यह बिना शर्त के const T& ले सकता है। यह दोनों lvalues ​​और rvalues ​​से बांध सकते हैं, और वादा पैरामीटर को संशोधित नहीं करने का वादा किया।

template<typename T> 
void f(const T& t) { ... } 
संबंधित मुद्दे