2016-07-13 14 views
8

मैं सोच रहा हूं कि कोड के निम्नलिखित भाग के बारे में मानक क्या कहता है। stringprintPointer पर कॉल करने से पहले अस्थायी वस्तु के विनाशक को निष्पादित किया जा सकता है?फ़ंक्शन कॉलिंग में लागू विनाशक निष्पादन

पेज। वीएस -2010 कंपाइलर इस कोड के बारे में शिकायत नहीं करता है और सही तरीके से काम करता है।

void printPointer(const string* pointer) 
{ 
    cout << *pointer << endl; 
} 

const string* func(const string& s1) 
{ 
    return &s1; 
} 

int main() 
{ 
    printPointer(func("Hello, World!!!")); 
} 
+4

अस्थायी स्ट्रिंग केवल बयान के अंत में विलुप्त है। कोई शायद संदर्भ को खोद सकता है (अनुक्रम बिंदुओं के साथ कुछ?) लेकिन आप इसे स्वयं देख सकते हैं: http://ideone.com/N3Brll – CompuChip

उत्तर

9

stringprintPointer पर कॉल करने से पहले अस्थायी वस्तु के विनाशक को निष्पादित किया जा सकता है?

नहीं, क्योंकि अस्थायी वस्तुओं पूर्ण अभिव्यक्ति जो बिंदु है जहां वे बनाए गए थे, जिसका अर्थ है यह printPointer() समाप्त होता है की प्रेरक जाने तक बना रहेगा शामिल मूल्यांकन में अंतिम चरण के रूप में नष्ट हो जाएगा।

मानक #12.2/4 Temporary objects [class.temporary] से:

अस्थायी वस्तुओं पूर्ण अभिव्यक्ति का मूल्यांकन करने में अंतिम चरण के रूप में नष्ट कर रहे हैं ([intro.execution]) कि (lexically) बिंदु है जहां वे शामिल होते हैं।

और #12.2/6 Temporary objects [class.temporary]:

एक समारोह कॉल ([expr.call]) में एक संदर्भ पैरामीटर के लिए बाध्य एक अस्थायी वस्तु पूर्ण अभिव्यक्ति कॉल युक्त के पूरा होने तक बनी रहती है।

explanatory demo

-6

आपका स्ट्रिंग, कार्यक्रम के अंत तक नष्ट नहीं है के रूप में s1 इसे करने के लिए एक संदर्भ (हां, तो यह func में नष्ट नहीं है) है। Func में पास-बाय-वैल्यू या रिटर्न-बाय-वैल्यू नहीं है। इस कोड में कोई समस्या नहीं है।

+4

'printPointer' कॉल के बाद उसकी स्ट्रिंग नष्ट हो जाती है। सिर्फ इसलिए कि इसका कोई संदर्भ नहीं है इसका मतलब यह नहीं है कि यह नष्ट नहीं होगा। –

+0

अपने तर्क से, 'printPointer (func ("हैलो, वर्ल्ड !!!") को बदलना); '' स्ट्रिंग * एस = func ("हैलो, वर्ल्ड !!!"); प्रिंट पॉइंटर; 'भी वैध होना चाहिए? – CompuChip

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