[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Re: Pimpl copying
From:       ramagnus () t-online ! de (Rolf Magnus)
Date:       2006-07-16 18:15:08
Message-ID: 200607162015.09506.ramagnus () kde ! org
[Download RAW message or body]

On Friday 14 July 2006 11:55, Reinhold Kainhofer wrote:

> Am Freitag, 14. Juli 2006 11:28 schrieb Lubos Lunak:
> > On Friday 14 July 2006 10:33, André Wöbbeking wrote:
> > > On Thursday 13 July 2006 23:05, Peter Kümmel wrote:
> > > >  void KTempDirTest::testBasic()
> > > >  {
> > > > -       KTempDir dir = KTempDir("test");
> > >
> > > normal ctor and then copy ctor
> >
> >  No. It's just syntactic sugar functionally completely equivalent to the
> > case below with just normal ctor. If any compiler uses copy ctor here
> > it's broken.
>
> Stroustrup's book says that
>    KTempDir dir = KTempDir("test");
> and
>    KTempDir dir("test");
> are equivalent. I.e. the first one should not use ctor and then copy.

I can't believe that. The C++ standard clearly says something else.

> I had a similar discussion with Mark a while ago (we were discussion which
> one was more efficient. Turned out they should be the same)

Well, eliding the copy constructor is an allowed optimization, but not 
required. Most compilers nowadays do it, AFAIK. However, a copy constructor 
still _must_ be available, even if the call is optimized away. That's because 
C++ requires that the correctness of code doesn't depend on optimization 
behavior. Consider this:

class Test
{
public:
    Test(int x) { }
private:
    Test(const Test&);
};

int main()
{
    Test t(3);             // will compile
    Test t2 = Test(3); // won't compile, even if copy constructor is not used
}

Any compiler that accepts the above code is broken.

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic