2010-04-18 12 views
11

बूस्ट लाइब्रेरीज़ का अध्ययन करने वाले मेरे रोमांच में, मैं फ़ंक्शन हस्ताक्षरों में आया हूं जिनमें पैरामीटर हैं जो ऑब्जेक्ट के संदर्भ के संदर्भ में हैं।सी ++ में किसी संदर्भ के संदर्भ का उपयोग करने का उद्देश्य क्या है?

उदाहरण:

void function(int && i); 

यह इस तरह से कर रही है बजाय बस एक वस्तु के लिए एक संदर्भ लेने के प्रयोजन/क्या लाभ है? मुझे लगता है कि अगर यह बढ़ावा में है तो एक है।

उत्तर

18

यह संदर्भ के संदर्भ में नहीं है; ऐसा कुछ नहीं है।

जो आप देख रहे हैं वह एक सी ++ 0x rvalue reference है, जो डबल एम्परसेंड, && द्वारा दर्शाया गया है। इसका मतलब यह है कि फ़ंक्शन में i तर्क अस्थायी है, इसलिए फ़ंक्शन को कॉलिंग कोड में समस्याएं उत्पन्न किए बिना अपने डेटा को क्लॉबर करने की अनुमति है।

उदाहरण:

void function(int &i); // A 
void function(int &&i); // B 
int foo(); 

int main() { 
    int x = foo(); 
    function(x);  // calls A 
    function(foo()); // calls B, because the return value is a temporary 
} 

यह बहुत ही कम सादे int रों के साथ उपयोगी है, लेकिन बहुत उपयोगी होता है जब इस कदम कंस्ट्रक्टर्स को परिभाषित करने, उदाहरण के लिए। एक चालक कन्स्ट्रक्टर एक कॉपी कन्स्ट्रक्टर की तरह है, सिवाय इसके कि यह मूल ऑब्जेक्ट से आंतरिक डेटा को सुरक्षित रूप से 'चोरी' कर सकता है, क्योंकि यह एक अस्थायी है जो चालक रिटर्न के बाद मौजूद होना बंद कर देगा।

+0

आह, ठीक है। स्पष्टीकरण के लिए धन्यवाद। इस कोड को अभी बढ़ावा (1.42) में कैसे है? यह मेरी समझ है कि वर्तमान में सी ++ 03 मानक के लिए बूस्ट लिखा गया है। –

+2

@ सिल्वर: यह कुछ कंपाइलरों की सुविधाओं का लाभ उठाएगा। कुछ कंपाइलर्स सी ++ 0x (थोड़ा) का समर्थन करते हैं, और यदि बूस्ट इसका पता लगाने और उसका उपयोग करना चाहता है, तो यह होगा। – GManNickG

+1

@ सिल्वरसुन: बूस्ट प्रत्येक कंपाइलर के लिए उपलब्ध है को अनुकूलित करने के लिए सशर्त संकलन (#if, आदि) का उपयोग करता है। –

3

यह संदर्भ के संदर्भ में नहीं है। यह एक रैल्यू संदर्भ है, जो आने वाली सी ++ 0x मानक द्वारा समर्थित एक नई सुविधा है।

2

जो आप देख रहे हैं वह एक रैल्यू-रेफरेंस है। यह सी ++ 0x की एक नई कोर भाषा सुविधा है। here या कम formaly here देखें।

मूल प्रस्ताव here

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