Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - Type conversions
#include <stdio.h> struct B; struct A { virtual B &get() = 0; operator B&() { printf("A::operator B&\n"); return get(); } }; struct B : public A { virtual B &get() { return *this; } }; struct C : public B { }; void f(B &b) { } int main() { B b; C c; printf("A &a = b\n"); A &a = b; printf("(B &) a\n"); f((B &) a); printf("a.get()\n"); f(a.get()); printf("b\n"); f(b); printf("c\n"); f(c); return 0; } When compiled with DM, I get the following output: A &a = b A::operator B& (B &) a A::operator B& a.get() b c A::operator B& I have no idea why DM uses "A::operator B&" to convert b to A&. And DM also shouldn't use the user-defined operator to convert c to B& (see 13.3.3.2 Ranking implicit conversion sequences [over.ics.rank], paragraph 2, of the C++ Standard: "a standard conversion sequence is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence..."). BTW, I get the expected result when using gcc 3.0: A &a = b (B &) a A::operator B& a.get() b c bye, Christof -- http://cmeerw.org JID: cmeerw jabber.at mailto cmeerw at web.de ...and what have you contributed to the Net? Dec 11 2002
At the moment, I decided to replace the preprocessor stage. The code in there is so old and byzantine, it no longer looked like any productive changes could be made to it. I hope to correct the longstanding problems with it. Dec 11 2002
|