www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/10/07/01:29:23

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> <eb8J3.1214$%K6 DOT 36 AT firefly>
Lines: 79
Message-ID: <aoUK3.214$_9.60@firefly>
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 <iostream.h>
>> #include <string.h>
>> 
>>  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
>

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019