2013-06-09 12 views
16

स्थिरांक योग्यता के कई लाभों में एक API अधिक समझ में आता है बनाने के लिए है, उदाहरण के लिए:C++ rvalue संदर्भ और स्थिरांक क्वालीफायर

template<typename T> int function1(T const& in); 
// clearly, the input won’t change through function1 
rvalue संदर्भ की शुरूआत के साथ

, एक आदर्श अग्रेषण लेकिन अक्सर स्थिरांक क्वालिफायर से फायदा हो सकता हटा दिए गए हैं, उदाहरण:

template<typename T> int function2(T&& in); 
// can explicitly forward the input if it's an rvalue 

दस्तावेज़ीकरण के अलावा, क्या यह वर्णन करने का एक अच्छा तरीका है कि function2 इसके इनपुट को नहीं बदलेगा?

+5

यदि आप किसी और को पैरामीटर अग्रेषित कर रहे हैं, तो आपको क्या लगता है कि 'कॉन्स्ट' क्या है या नहीं? आप उन्हें इससे निपटने देते हैं। –

उत्तर

28
template<typename T> int function2(T&& in); 
// can explicitly forward the input if it's an rvalue 

अलावा दस्तावेज़ से, वहाँ का वर्णन करने के कि function2 अपने इनपुट में परिवर्तन नहीं होगा एक अच्छा तरीका है?

हां। सी ++ 03 समाधान के साथ बने रहें:

template<typename T> int function1(T const& in); 
// clearly, the input won’t change through function1 

सही अग्रेषण के क्या लाभ हैं कि आप ग्रहण करने के लिए अगर कुछ const या गैर const, lvalue या rvalue है नहीं करना चाहती। यदि आप यह लागू करना चाहते हैं कि कुछ संशोधित नहीं किया गया है (यानी यह const है), तो const जोड़कर स्पष्ट रूप से ऐसा कहें।

आप ऐसा कर सकता है:

template<typename T> int function1(T const&& in); 
// clearly, the input won’t change through function1 

हालांकि हर किसी को अपने कोड को पढ़ने के लिए आश्चर्य होता तुम क्यों rvalue संदर्भ का उपयोग किया है। और function1 अंतराल को स्वीकार करना बंद कर देगा। बस इसके बजाय const & का उपयोग करें और हर कोई समझ जाएगा। यह एक सरल और अच्छी तरह से समझ लिया मुहावरे है।

आप पूरी तरह से आगे नहीं बढ़ना चाहते हैं। आप अपरिवर्तनीयता लागू करना चाहते हैं।

9

आप इस कह सकते हैं:

template <typename T> 
typename std::enable_if<immutable<T>::value, int>::type 
function(T && in) 
{ 
    // ... 
} 

जहां की तरह कुछ है:

template <typename T> struct immutable 
: std::integral_constant<bool, !std::is_reference<T>::value> {}; 

template <typename U> struct immutable<U const &> 
: std::true_type {}; 

इस तरह, टेम्पलेट केवल प्रयोग करने योग्य हो सकता है अगर सार्वभौमिक संदर्भ या तो है एक स्थिरांक-संदर्भ (ताकि T = U const &) या एक रावल्यू-संदर्भ (इसलिए T एक संदर्भ नहीं है)।


जिसके अनुसार, अगर तर्क को बदलने की नहीं जा रहा है, तो आप सिर्फ T const & इस्तेमाल कर सकते हैं और इसके साथ किया जाना है, कुछ भी अस्थायी मूल्यों के mutably बंधन से प्राप्त होने के बाद से वहाँ।

संबंधित मुद्दे