को छोड़कर मैंने हाल ही में कन्स्ट्रक्टर/असाइनमेंट को स्थानांतरित करने के लिए नया noexcept
विनिर्देश जोड़ने शुरू कर दिया। अब मुझे आश्चर्य हुआ कि निहित जेनरेट किए गए सदस्य कार्यों का अपवाद विनिर्देश कैसा दिखता है। चूंकि noexcept
चाल फ़ंक्शन अधिक कुशल कोड पथों का उपयोग करने की अनुमति देता है (उदा। vector
का आकार बदलते समय) मुझे आशा है कि जब भी संभव हो, उन्हें अस्वीकार्य घोषित किया जाएगा। मैं समझ मानक क्या है कि के बारे में क्या कहना है समस्या नहीं थी और इसलिए इस पर कुछ पकड़ पाने के लिए जी ++ 4.6 (-std=c++0x
के साथ) में निम्न कोड की कोशिश की:लागू जेनरेट सदस्यों और
struct foobar{};
int main()
{
foobar a, b;
std::cout<<std::boolalpha
<<noexcept(foobar())<<", "<<noexcept(foobar(a))<<", "
<<noexcept(a = b) <<", "<<noexcept(a = std::move(b))<<", "
<<noexcept(foobar(std::move(a)))<<std::endl;
}
यह मैं True, True, True, False, False
का उत्पादन दे दी है, जिसका अर्थ है वह डिफॉल्ट और कॉपी कन्स्ट्रक्टर/असाइनमेंट जहां noexcept
, जबकि ऑपरेशन को स्थानांतरित करें, जहां नहीं।
मेरे सवाल के लिए:
के तहत किन परिस्थितियों निहित उत्पन्न कर रहे हैं (या डिफॉल्ट) सदस्य कार्यों noexcept
रूप में घोषित किया? इसके अलावा foobar
के लिए मोटापेदार व्यवहार gcc4.6 में सही या बस एक कंपाइलर बग है?
तो क्या इसका मतलब यह है कि जब भी संभव हो तो वे कार्य 'अस्वीकरण' होते हैं (उर्फ वे किसी फेंकने वाले कार्यों को नहीं कहते हैं)? – Grizzly
@ ग्रीज़ली: हां। – kennytm
@Grizzly: मुझे लगता है कि इसका मतलब है कि वे 'अस्वीकरण' होंगे यदि वे केवल 'अस्वीकरण' कार्यों को कॉल करते हैं (यानी क्या फेंकने वाले वास्तविक कार्यों को अप्रासंगिक है, अपवाद विनिर्देश महत्वपूर्ण है) –