2011-08-08 16 views
7

पर विचार करें निम्नलिखित कोड फेंकता है:समारोह-गुंजाइश स्थिर वस्तु के निर्माता एक अपवाद

#include <iostream> 

struct X{ 
    X(){ 
     throw 0; 
    } 
}; 

void f(){ 
    static X x; 
} 

int main(){ 
    try { 
     f(); 
    } 
    catch(int) { 
     std::cout << "Caught first time" << std::endl; 
    } 
    try { 
     f(); 
    } 
    catch(int) { 
     std::cout << "Caught second time" << std::endl; 
    } 
} 

इस कार्यक्रम का उत्पादन होता है

पकड़ा पहली बार
पकड़ा दूसरी बार

तो, क्या यह मानक द्वारा गारंटीकृत है कि एक स्थिर वस्तु के निर्माता को बार-बार कहा जा रहा है आईएल यह सफलतापूर्वक पूरा हो गया है? मुझे उस मानक में जगह नहीं मिल सकती है जहां इसका उल्लेख किया गया है, इसलिए उद्धरण या अध्याय और कविता का संदर्भ बहुत स्वागत है।

या क्या मेरे उदाहरण में कोई अपरिभाषित व्यवहार शामिल है?

उत्तर

14

यह गारंटी है कि निर्माण तब तक प्रयास किया जाएगा जब तक यह विफल हो जाए।

यह क्या सी ++ 03 §6.7/4 में कहा गया है की वजह से है:

... नहीं तो इस तरह के एक वस्तु आरंभ नहीं हो जाता पहली बार नियंत्रण अपनी घोषणा से होकर गुजरता है; इस तरह की वस्तु को प्रारंभिकरण के पूरा होने पर प्रारंभ माना जाता है। यदि प्रारंभिक अपवाद फेंकने से निकलता है, तो प्रारंभिकता पूर्ण नहीं होती है, इसलिए अगली बार नियंत्रण घोषणा में प्रवेश करने की कोशिश की जाएगी। यदि ऑब्जेक्ट प्रारंभ होने पर नियंत्रण फिर से प्रवेश (पुनरावृत्ति) में प्रवेश करता है, तो व्यवहार अपरिभाषित होता है। [उदाहरण:

int foo(int i) 
{ 
    static int s = foo(2*i); // recursive call – undefined 
    return i+1; 
} 

--end उदाहरण]

मैं, नोट करेंगे कि जीसीसी पुनरावर्ती प्रारंभ करने का प्रयास करने के मामले में एक अपवाद फेंकता litb's related question मेरे स्रोत के लिए के रूप में देखते हैं।

+1

धन्यवाद। अब जब मैं सी ++ के इस आर्केन "फीचर" के बारे में जानता हूं, तो मैं इसका दुरुपयोग करने की कोशिश करूंगा। –

+0

@ एलेक्सेंड्रे सी .: सिंगलटन क्यों नहीं बनाते! –

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