ओह, यह बहुत अमान्य है।
पर विचार करें:
#include <iostream>
using namespace std;
struct A {
virtual ~A() { cout << "~A" << endl; }
virtual void doit() const = 0;
};
struct B : public A
{
~B() override { cout << "~B" << endl; }
void doit() const override { cout << "A::doit" << endl; }
};
struct C : public A
{
~C() override { cout << "~C" << endl; }
virtual void doit() const { cout << "C::doit" << endl; }
};
void foo(bool p)
{
cout << "foo(" << p << ")" << endl;
const A &a = (p ? static_cast<const A &>(B()) : static_cast<const A &>(C()));
a.doit();
}
auto main(int argc, char* argv[]) -> int
{
cout << boolalpha;
foo(true);
cout << endl;
foo(false);
}
Coliru Viewer में आउटपुट, जी ++ 4.8 का उपयोग कर:
foo(true)
~B
~A
pure virtual method called
terminate called without an active exception
bash: line 7: 16922 Aborted (core dumped) ./a.out
यह यूबी इसलिए किसी भी स्पष्टीकरण सच हो सकता है, लेकिन एक हद सुनिश्चित हो सकता है, विधानसभा की ओर देखे बिना, यह होता है कि:
- एक अस्थायी बनाया गया है।
- यह संदर्भ के लिए बाध्य है।
यह एक संदर्भ के संदर्भ में एक संदर्भ है, इसलिए इसमें एक नए अस्थायी या टुकड़े का निर्माण शामिल नहीं है।
- अस्थायी नष्ट हो गया है।
- इसके भाग के रूप में इसके गतिशील प्रकार (vtable सूचक) को
A
में बदल दिया गया है, जो सार है।
A
में शुद्ध आभासी कहा जाता है।
स्रोत
2014-04-14 01:05:41
http://stackoverflow.com/questions/14405837/lifetime-extension-and-the-conditional-operator –
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects .html # 86 –
मेरे लिए बिल्कुल ठीक लग रहा है ... क्या, विशेष रूप से, आपकी चिंता है? – ildjarn