Hi,
first thing, in your code, you should return *this in the operator= (and check if &a equals 'this'), which, I assume, you just forgot.
Yes, this code is just supposed to demonstrate the problem.
3: second = pointer ? *pointer : A();
@3: The compiler creates a anonymous, automatic object for class A on compile-time and copies members from *pointer via its copy-constructor into it (setting d=0!). Then, the operator= gets called for second with the temporary object as an argument (hence, copying d=0 into second).
Yes, running gdb made clear that something like this is happening, and I am willing to accept that this is according to the spec ;-)
Try the attached code, which'll make it clearer, I presume...
Apparently, the copy-constructor in cChannel needs explanation...
In sections.c:143, the code intends to copy the object, but the object is not copied, resulting in a bogus channel returned by cFilter::Channel(), and this is a bug in VDR.
I think that because of the possible implicit invocation of a copy constructor as seen in the example and in real code, a copy constructor should really be a copy constructor and equivalent to operator=. Otherwise you will run into bugs like above.
(See http://braincore.blogspot.com/2005/06/koding-big-four.html http://grammarian.homelinux.net/%7Empyne/weblog/tutorial/c%2B%2B-tidbits.htm... for two KDE hackers' comments on providing copy constructors.)
Marcel