2011-08-10 21 views
15

मैंने हाल ही में ग्लूबल, xvalues ​​और prvalues ​​के साथ-साथ rvalue संदर्भों के C++ 0x की अवधारणाओं के आस-पास अपना दिमाग लपेट लिया है। हालांकि, एक चीज है जो अभी भी मुझे बढ़ाती है:फ़ंक्शन प्रकार के लिए एक रैल्यू संदर्भ क्या है?

क्या है "फ़ंक्शन प्रकार का एक रावल्यू संदर्भ"? यह ड्राफ्ट में कई बार सचमुच उल्लेख किया गया है। ऐसी अवधारणा क्यों पेश की गई थी? इसके लिए क्या उपयोग हैं?

+0

क्या आपने अंततः उत्तर को समझ लिया? मैंने उत्तर के तहत एक टिप्पणी छोड़ दी है, इसलिए यदि आप स्पष्टीकरण से अवगत हैं तो कृपया इसे प्रदान करें। धन्यवाद –

उत्तर

15

मैं परिपत्र होने के लिए नफरत है, लेकिन एक rvalue संदर्भ टी कार्य करने के लिए ype फ़ंक्शन प्रकार के लिए एक रैल्यू संदर्भ है। फ़ंक्शन प्रकार जैसी कोई चीज़ है, उदा। void()। और आप इसके लिए एक रैल्यू संदर्भ बना सकते हैं।

N3055 द्वारा प्रस्तुत वर्गीकरण प्रणाली के संदर्भ में, यह एक xvalue है।

इसका उपयोग दुर्लभ और अस्पष्ट है, लेकिन यह बेकार नहीं है। उदाहरण के लिए विचार करें:

void f() {} 
... 
auto x = std::ref(f); 

x टाइप है:

std::reference_wrapper<void()> 

और अगर आप reference_wrapper के लिए सार को देखो यह शामिल हैं:

reference_wrapper(T&) noexcept; 
reference_wrapper(T&&) = delete; // do not bind to temporary objects 

इस उदाहरण T में समारोह प्रकार void() है । और इसलिए दूसरी घोषणा यह सुनिश्चित करने के उद्देश्य से reference_wrapper को रैवल्यू तर्क के साथ निर्मित नहीं किया जा सकता है, इसके उद्देश्य के लिए फ़ंक्शन प्रकार का एक रैल्यू संदर्भ बनाता है। भले ही T न हो।

यदि यह कार्य के लिए एक रावल्यू संदर्भ बनाने के लिए कानूनी नहीं था, तो इस सुरक्षा के परिणामस्वरूप संकलन समय त्रुटि होगी, भले ही हमने निर्माता को T नहीं दिया।

+3

मुझे लगता है कि आपका मतलब 'शून्य()' था। 'शून्य()()' जीसीसी/बिनटिल्स का गलत गड़बड़ था लेकिन [कुछ समय पहले तय किया गया था] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46332)। –

+1

@ जोहान्स: धन्यवाद! वह * सबसे * सहायक था! –

+0

यह डरावना है और मुझे समझ में समस्याएं हैं। संकलन समय त्रुटि के बारे में अंतिम वाक्य के बारे में- क्या इस मामले में दूसरी घोषणा को अनदेखा करने के लिए SFINAE नहीं होगा? – Kos

0

वर्ष C++ मानक का पालन में मना किया है:

int foo(); 
void bar(int& value); 

int main() 
{ 
    bar(foo()); 
} 

क्योंकि foo की वापसी प्रकार() एक rvalue है और बार के संदर्भ द्वारा पारित कर दिया है()।

यह माइक्रोसॉफ्ट एक्सटेंशन दृश्य ग में सक्षम ++ के बाद से (मुझे लगता है कि) 2005

C++ 0x (या MSVC) के बिना संभावित समाधानों की घोषणा की जाएगी

void bar(const int& value); 

या उपयोग करने के साथ हालांकि अनुमति दी गई थी अस्थायी-चर, foo (की वापसी-मूल्य) भंडारण और चर गुजर (संदर्भ के रूप में) बार():

int main() 
{ 
    int temp = foo(); 
    bar(temp); 
} 
+5

शायद मैंने सवाल को गलत समझा, लेकिन मुझे लगता है कि ओपी कार्य प्रकारों (यानी लैम्ब्डा और इसी तरह) के संदर्भ में रैल्यू के बारे में बात कर रहा है। – user786653

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