The two programs below differ by the location of =default applied to
the move constructor. In the first program, it is defaulted inside
the class during declaration. In the second program, it is defaulted
outside the class in the definition.
The first program does not compile. The second does compile. Is it a
bug or am I misuse gcc?
Thanks.
$ cat test1.cc
struct U {
U();
U(U const&);
};
struct X {
U const u;
X()=default;
X(X&&)=default;
};
X test() {
X a={};
return a;
}
$ g++ -c -std=c++0x test1.cc
test1.cc: In function 'X test()':
test1.cc:14:10: error: use of deleted function 'X::X(X&&)'
test1.cc:9:3: error: 'X::X(X&&)' is implicitly deleted because the default
definition would be ill-formed:
test1.cc:9:3: error: non-static data member 'X::u' does not have a move
constructor or trivial copy constructor
$ cat test2.cc
struct U {
U();
U(U const&);
};
struct X {
U const u;
X()=default;
X(X&&);
};
X::X(X&&)=default;
X test() {
X a={};
return a;
}
$ g++ -c -std=c++0x test2.cc && echo $?
0