[cfe-dev] Move constructor forces copy assignment to be implicitly defaulted?

Suman Kar skarpio at gmail.com
Fri May 25 01:44:36 PDT 2012


The following piece of code:

struct movable {
	movable() {}
	movable(movable const&) {}
	movable(movable &&) {}

void copy_assignment(movable && t) {
	movable m;
	m = t;

int main() {}

with clang (version details):
clang version 3.2 (trunk 157115) (llvm/trunk 157155)
Target: i686-pc-mingw32
Thread model: posix

throws an error (and some helpful diagnostics). The error message is:
copytest.cpp:63:4: error: overload resolution selected implicitly-deleted copy
      assignment operator
        m = t;
copytest.cpp:58:2: note: copy assignment operator is implicitly deleted because
      'movable' has a user-declared move constructor
        movable(movable &&) {}
1 error generated.

My reading of the relevant section of the standard (I only have N3126
handy, so I may be mistaken): ยง12.8/20:

      If the class definition does not explicitly declare a
      copy assignment operator and there is no user-declared
      move assignment operator, a copy assignment operator
      is implicitly declared as defaulted (8.4).

tells me that an implicitly *defaulted* copy assignment operator
should've been generated and used instead.

I am using this clang with gcc 4.6. gcc 4.6 (standalone) seems to
accept this (with -std=c++0x, -Wall and a few other warning parameters
turned on).

Can someone help me understand this behavior?

Suman Kar

More information about the cfe-dev mailing list