c++ - The destructor for the class member `B`, why is it invoked in the snippet below? -
from §5.3.5[expr.delete]/1, can understand destructor object *a
not invoked in snippet below. didn't understand why destructor class member b
invoked in case, can seen in live example.
#include <iostream> class { public: class b{ public: ~b(){ std::cout << "b dtor" << '\n'; } }; a() { p = new b(); } operator b*() { return p; } private: b* p; }; int main() { a* = new a(); delete *a; std::cout << "end" << '\n'; }
would appreciate quote standard explaining this.
your delete *a
applies operator delete
non-pointer expression *a
of type a
. way can legal when type a
implicitly convertible pointer type.
5.3.5 delete [expr.delete]
1 ... operand shall have pointer object type, or class type having single non-explicit conversion function (12.3.2) pointer object type.
2 if operand has class type, operand converted pointer type calling above-mentioned conversion function, , converted operand used in place of original operand remainder of section.
in case class a
implicitly convertible b *
, happens when delete *a
.
in other words, delete *a
interpreted as
delete (*a).operator b*();
it b
delete
in code, not a
. why destructor of b
called.
if wanted destroy a
object, you'd have do
delete a;
(note, no *
). not call b
's destructor.
Comments
Post a Comment