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