7 messages in com.mysql.lists.plusplusRe: Beta 2: Warning when compiling pr...| From | Sent On | Attachments |
|---|---|---|
| Pål Brattberg | 13 Jul 2005 02:46 | |
| Warren Young | 13 Jul 2005 14:01 | |
| Carlos M. Gutierrez | 21 Jul 2005 09:57 | |
| Carlos M. Gutierrez | 21 Jul 2005 10:07 | |
| Chris Frey | 21 Jul 2005 15:11 | |
| Warren Young | 21 Jul 2005 17:28 | |
| Chris Frey | 21 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




