2014-10-14 16 views
7

एक रावल्यू संदर्भ का पता लेने का क्या अर्थ है?

void foo(int&& x) { 

    std::cout << &x; 
} 

यह काम करता है, लेकिन यह पता वास्तव में क्या दर्शाता है यह देखते हुए? क्या एक अस्थायी int बनाया गया है जब foo कहा जाता है और यह पता क्या है? यदि यह सत्य है और यदि मैं int y = 5; foo(static_cast<int&&>(y)); लिखता हूं, तो क्या यह एक और अस्थायी बनने का कारण बनता है या संकलक बुद्धिमानी से वाई को संदर्भित करेगा?

+0

अस्थायी नहीं होना चाहिए। कुछ भी आपको int int = 42 करने से रोकता है; foo (x); ' –

+1

FWIW, आपकी कास्ट बस' std :: move (y) 'है। – chris

+3

@IgorTandetnik, यह संकलित नहीं होगा क्योंकि रैवल संदर्भ संदर्भों से बंधे नहीं हैं। – chris

उत्तर

7

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

int y = 5; foo(static_cast<int&&>(y)); अस्थायी नहीं बनाता है। इस रूपांतरण मानक का हिस्सा 5.2.9/3 में वर्णित है:

एक glvalue, वर्ग prvalue, या प्रकार के "cv1 T1" सरणी prvalue "cv2 T2 को rvalue संदर्भ" टाइप करने के लिए करता है, तो "cv2 T2" संदर्भ-संगत है ढाला जा सकता है "cv1 T1" के साथ।

उदाहरण के लिए आप foo(1); पर कॉल करते हैं तो एक अस्थायी बनाया जाएगा।

+0

रैवल के बारे में बात करते समय, मैं "अस्थायी वस्तुओं" के बजाय "अनाम चर" शब्द का उपयोग करना पसंद करता हूं। तो, verbosity कम हो गया है: «std :: move ने ऑब्जेक्ट को अनाम बना दिया", और 'int && x' अज्ञात पूर्णांक से बांधता है। –

+1

@ पेरेगिंग-एलके अगर आप अपना ब्लॉग पोस्ट लिखते हैं या उन लोगों से बात करते हैं जिन्हें आप जानते हैं एक लंबा समय, या आपको कुछ स्रोत का संदर्भ देना चाहिए, क्योंकि सी ++ मानक में "अज्ञात ऑब्जेक्ट" की कोई परिभाषा नहीं है। यहां जवाब देने पर मुझे लगता है कि हर किसी को जानता है कि शब्दों को संचालित करना बेहतर है या कम से कम एक प्रसिद्ध जगह में देख सकते हैं । –

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