7 messages in com.mysql.lists.plusplusRe: Beta 2: Warning when compiling pr...
FromSent OnAttachments
Pål Brattberg13 Jul 2005 02:46 
Warren Young13 Jul 2005 14:01 
Carlos M. Gutierrez21 Jul 2005 09:57 
Carlos M. Gutierrez21 Jul 2005 10:07 
Chris Frey21 Jul 2005 15:11 
Warren Young21 Jul 2005 17:28 
Chris Frey21 Jul 2005 19:45 
Subject:Re: Beta 2: Warning when compiling program in FC4 GCC4
From:Chris Frey (cdf@netdirect.ca)
Date:07/21/2005 07:45:24 PM
List:com.mysql.lists.plusplus

On Thu, Jul 21, 2005 at 06:29:03PM -0600, Warren Young wrote:

Chris Frey wrote:

The latest SVN version has this "fixed", but incorrectly in my opinion. It currently just returns *this, whereas I don't think operator=() should be defined at all, just declared.

Does this actually suppress the compiler-generated version?

Yep.

tmp $ cat oe.cc class A { private: A(const A&); A& operator=(const A&);

int i;

public: A() : i(5) {} };

int main() { A a, b; a = b; return 0; }

tmp $ g++ -Wall -o oe oe.cc oe.cc: In function `int main()': oe.cc:5: error: `A& A::operator=(const A&)' is private oe.cc:16: error: within this context

This also flags an error for derived classes too. The thing you want to be careful about is if you're doing virtual operator=(), with a base class as the const reference argument. For example:

class A { public: virtual A& operator=(const A&); // this overrides the default };

class B : public A { public: virtual A& operator=(const A&); // this does not // there is a hidden, automatic, operator=(const B&) here too! // and the automatic operator=() will call the user-defined // A::operator=() for us. };

Regardless, operator= does normally return *this, so the only problem with doing it this way is that it generates a tiny bit more code than if it were only declared and not defined.

I think all we care about is the compiler warning, so no copy is done accidentally.

- Chris