2012-07-07 29 views
5

बेहतर एक उदाहरण से समझाया का कारण बनता है कार्यक्रम 0 प्रिंट करता है जो गलत है। असली कोड एक सीजी गलती हो जाता है।एक स्थिरांक रेफरी सदस्य के लिए एक अस्थायी बताए एक विभाजन गलती

मुझे उम्मीद है कि एक कॉन्स संदर्भ में आवंटित एक अस्थायी जीवन काल को लंबे समय तक बढ़ाने का नियम यहां होगा, लेकिन स्पष्ट रूप से यह नहीं है। क्या आपको कारण पता है?

उत्तर

4

वह नियम कक्षा के सदस्यों पर लागू नहीं होता है। यह सी ++ 03 मानक के 12.2.5 में कहा गया है:

A temporary bound to a reference member in a constructor's ctor-initializer 
persists until the constructor exits. 

तुलना में अस्थायी पिछले लंबे समय तक बना अर्थ होगा उस वर्ग के हिस्से के रूप में रखा जाना चाहिए, ताकि उसके जीवन हो सकता है के लिए होता है अस्थायी बनाए रखा। यह असंभव होगा अगर कन्स्ट्रक्टर एक अलग संकलन इकाई में था, क्योंकि कक्षा को परिभाषित किया जाना चाहिए जब कक्षा को परिभाषित किया जाना चाहिए।

// header file 
struct A { 
    A(); 
    B &b; 
}; 


// file1.cpp 
void f() 
{ 
    A a; // Reserve the size of a single reference on the stack. 
} 


// file2.cpp 
A::A() 
: b(B()) // b is referencing a temporary, but where do we keep it? 
     // can't keep the temporary on the stack because the 
     // constructor will return and pop everything off the stack. 
     // Can't keep it in the class because we've already said the 
     // class just contains a single reference. 
{ 
} 
+0

स्पॉट ऑन, मुझे नहीं पता कि इसके लिए कोई अपवर्तक क्यों नहीं थे। आज धीमा दिन :( –

+0

संक्षेप और व्यापक। बहुत बहुत धन्यवाद! – davka

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

  • कोई संबंधित समस्या नहीं^_^