From: wemccaug AT prairienet DOT org (Wendy E. McCaughrin) Newsgroups: comp.os.msdos.djgpp Subject: Re: no copy-ctor for temps References: <37F562D4 DOT 57291365 AT a DOT crl DOT com> Lines: 79 Message-ID: Date: Thu, 07 Oct 1999 03:24:54 GMT NNTP-Posting-Host: 192.17.3.4 X-Complaints-To: newsmgr AT prairienet DOT org X-Trace: firefly 939266694 192.17.3.4 (Wed, 06 Oct 1999 22:24:54 CDT) NNTP-Posting-Date: Wed, 06 Oct 1999 22:24:54 CDT Organization: Prairienet -- Your Community Network for East Central Illinois To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com In a previous article, weiqigao AT a DOT crl DOT com (Weiqi Gao) says: >"Wendy E. McCaughrin" wrote: >> >> The following example shows that 'gxx' will not invoke a copy-ctor >> for temporaries, only for variables. > >There's no need to. > >> #include >> #include >> >> class Overflow >> { char mssg[80]; >> public: >> Overflow( char* ccp ) { strcpy(mssg,ccp); } >> Overflow( const Overflow& ovfl ) // must be 'const' ! >> { cerr << "copy ctor: "; strcpy(mssg,ovfl.mssg); } >> void Report() { cerr << mssg; } >> }; >> >> void TstCpy( Overflow ); // call by value >> >> int main() >> { Overflow of = " I am a variable\n"; >> TstCpy(of); // passing a variable: copy-ctor invoked >> TstCpy(Overflow(" I am a temporary\n")); // passing temp: no >> // copy-ctor > >The object is constructed on TstCpy()'s stack. Well ... not exactly :) I single-stepped through the disassembled code via FSDB and found that the object is ctor'd on main's stack, not on TstCpy's. The argument passed to TstCpy() is always a ptr to the temp, in both calls: that ptr is an address in main's stack-frame. >Remember that argument passing is like initialization. Therefore > > TstCpy(of); > >is akin to > > Overflow temp = of; Correct. That is just what I would expect, so why is passing a temp different semantics (other than efficiency)? > >which invokes the copy constructor, whereas > > TstCpy(Overflow(" I an a temporary\n")); > >is akin to > > Overflow temp = Overflow(" I an a temporary\n"); > >which does not invoke the copy constructor, but merely constructs the >new object at the place where temp is allocated. > >> return 0; >> } >> >> void TstCpy(Overflow ovrflw) >> { ovrflw.Report(); } >> >> >> When compiled and run, the output is: >> >> copy ctor: I am a variable (indicating call of copy-ctor) >> I am a temporary (defaults to bit-wise copy) > >It's not a bit-wise copy after all. > >-- >Weiqi Gao >weiqigao AT a DOT crl DOT com >