Article View: be.comp.programming
Article #5095Re: [C++] function overloading en typedef
From: Nicolas Barbier
Date: Thu, 29 May 2003 11:03
Date: Thu, 29 May 2003 11:03
83 lines
4098 bytes
4098 bytes
Bert Peers wrote:
> Nicolas Barbier wrote:
>
>> Bert Peers wrote:
>>
>>>Maar dan nog weet ik niet of dit helpt -- de copy constructor wordt
>>>aangeroepen op het moment dat de return value van de functie in de
>>>"recipient" terecht komt.Als die recipient enkel een const& nodig heeft,
>>>moet er niks gekopieerd worden. Ik zou zelfs bijna zeker zeggen,
>>>"..._mag_ er niks gekopieerd worden".
>>
>> Ben je daar zeker van? Je bedoelt dus dan in dit geval de
>> copy-constructur niet opgeroepen mag worden? Ik dacht altijd (puttende
>> uit mijn absoluut onbenullige C++ kennis :-) dat hij altijd wordt
>> aangeroepen als je een volledig object returnt uit een functie. Trouwens,
>> waar zouden, bij een gemiddelde compiler, anders de bytes van het object
>> blijven staan?
>
> Wel, de compiler is nu eenmaal verplicht om, als er een
> const-reference naar een temporary gebruikt wordt als parameter,
> te zorgen dat die temporary "lang genoeg" blijft hangen.
>
> Denk maar aan het meer vertrouwde
>
> void blabla (const std::string &s);
> blabla ("yup");
>
> Je kan die gimme zien als een "conversie" die van niks
> een Blaat maakt... Trouwens, of de copy c'tor nu aangeroepen
> wordt of niet, het mysterie van de bytes wordt er niet minder
> op : gezien het feit dat bliep een const Blaat& als argument
> heeft, naar waar zou er dan eigenlijk gekopieerd worden ?
> Antwoord : eveneens naar een onzichtbare Blaat die eventjes snel
> wordt gealloceerd zodat bliep er een const& van kan krijgen.
>
> De compiler heeft meer opties dan "heap of stack" :^)
> In die zin klopt het dat er een kopie buiten
> "de normale ruimte van de functie" (dwz de stack) wordt
> gemaakt -- waar het om gaat is dat de copy constructor
> daar niet voor (mag) gebruikt worden, enkel compiler magic.
Ik leer weer bij over de semantiek van C++ :-).
/* test.cpp */
#include <iostream>
class Blaat {
public:
Blaat(int i) {
std::cout << "constructor" << std::endl;
}
Blaat(const Blaat &b) {
std::cout << "copy constructor" << std::endl;
}
static Blaat gimme() {
return Blaat(3);
}
};
int main()
{
Blaat a(Blaat::gimme());
std::cout << "tussen a en b" << std::endl;
Blaat b(a);
}
/* uitvoer */
constructor
tussen a en b
copy constructor
De semantiek van een functie die een object returnt is dus blijkbaar niet
"kopieer het te returnen object (via de copy constructor) naar de
ontvangende temporary van de aanroepende functie", maar eerder "de
ontvangende temporary van de aanroepende functie is hetzelfde object als
hetgeen gereturnd wordt".
Weet je toevallig ook nog waarom er geen copy constructor-aanroep gebeurt
tussen "constructor" en "tussen a en b"? :-)
--
Nicolas Barbier
Technical Details
Message-ID:
<3ed5e932$0$6524$afc38c87@sisyphus.news.be.easynet.net>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!news.tele.dk!news.tele.dk!small.news.tele.dk!eusc.inter.net!easynews.net!newsfeed3.easynews.net!feed1.news.be.easynet.net!sisyphus.news.be.easynet.net!not-for-mailReferences:
<3ed4a249.0@news.ruca.ua.ac.be> <T%8Ba.229391$me2.30588678@amsnews02.chello.com> <3ed5259a$0$6525$afc38c87@sisyphus.news.be.easynet.net> <lxaBa.230897$me2.30732029@amsnews02.chello.com>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,3077f069a49c0aca X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2003-05-29 04:05:55 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!news.tele.dk!news.tele.dk!small.news.tele.dk!eusc.inter.net!easynews.net!newsfeed3.easynews.net!feed1.news.be.easynet.net!sisyphus.news.be.easynet.net!not-for-mail Message-ID: <3ed5e932$0$6524$afc38c87@sisyphus.news.be.easynet.net> From: Nicolas Barbier <anti@spam.invalid> Subject: Re: [C++] function overloading en typedef Newsgroups: be.comp.programming Date: Thu, 29 May 2003 13:03:33 +0200 References: <3ed4a249.0@news.ruca.ua.ac.be> <T%8Ba.229391$me2.30588678@amsnews02.chello.com> <3ed5259a$0$6525$afc38c87@sisyphus.news.be.easynet.net> <lxaBa.230897$me2.30732029@amsnews02.chello.com> User-Agent: KNode/0.6.1 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7Bit Lines: 83 Organization: [ posted via Easynet Belgium ] NNTP-Posting-Date: 29 May 2003 11:04:19 GMT NNTP-Posting-Host: 213.193.183.51 X-Trace: 1054206259 6524 [::ffff:213.193.183.51]:32841 X-Complaints-To: abuse@be.easynet.net