[except.ctor] में मानक (N4140) गारंटी देता है कि:फ़ंक्शन रिटर्न वैल्यू स्वचालित ऑब्जेक्ट्स हैं और इस प्रकार नष्ट होने की गारंटी है?
... विनाशकर्ता निर्माण के बाद से कोशिश ब्लॉक दर्ज किया गया था सभी स्वत: वस्तुओं के लिए लागू कर रहे हैं ...
हालांकि निम्नलिखित उदाहरण में खाली output साबित करता है कि फ़ंक्शन foo
का वापसी मूल्य नष्ट नहीं हुआ है, हालांकि इसका निर्माण किया गया है। जी ++ (5.2.1) और क्लैंग ++ (3.6.2-1) और विकल्पों के साथ -O0 -fno-elide-constructors -std=c++14
का उपयोग करके संकलित।
struct A { ~A() { cout << "~A\n"; } };
struct B { ~B() noexcept(false) { throw 0; } };
A foo() {
B b;
return {};
}
int main() {
try { foo(); }
catch (...) { }
}
यह एक बग दोनों ग्राम में ++ और बजना ++ है, या समारोह वापसी मान स्वचालित वस्तुओं नहीं माना जाता है, या यह सी ++ भाषा में एक पाश छेद है?
[stmt.return] में से कोई भी में, [expr.call] या [dcl.fct] मैं एक समारोह वापसी मान एक स्वत: वस्तु माना जाए या नहीं स्पष्ट कथन को खोजने के लिए सक्षम है।
... एक वापसी कथन निर्माण शामिल और कॉपी या एक अस्थायी वस्तु की चाल कर सकते हैं ...
और 5.2.2 p10: निकटतम संकेत मैंने पाया 6.3.3 p2 हैं :
एक समारोह कॉल एक lvalue यदि परिणाम प्रकार एक lvalue संदर्भ प्रकार या एक rvalue संदर्भ प्रकार कार्य करने के लिए, एक XValue अगर परिणाम प्रकार एक rvalue संदर्भ प्रकार आपत्ति उठाने का है, और एक prvalue अन्यथा ।
मैंने पाया कि दोनों जीसीसी और क्लैंग में पहले से ही इस बग के खिलाफ दायर किया गया है, इसलिए मुझे उम्मीद नहीं है कि वे जल्द ही इसे ठीक कर देंगे: [gcc] (https://gcc.gnu.org/bugzilla/show_bug.cgi आईडी = 3379 9), [क्लैंग] (https://llvm.org/bugs/show_bug.cgi?id=12286)। –
क्या इस मामले में संकलक को ऑब्जेक्ट 'ए' के निर्माण को छोड़ने की अनुमति है? मेरा मतलब आरवीओ के समान कुछ नियम है। – Mikhail
@ मिखाइल मुझे विश्वास नहीं है। आरवीओ पूरी तरह से निर्माण को खत्म नहीं कर सकता है, यह * मध्यवर्ती * निर्माण को खत्म कर सकता है। – TartanLlama