http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53733
Bug #: 53733 Summary: [C++11][DR 1402] Move constructor/assignment operator too often deleted Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: daniel.krueg...@googlemail.com CC: ja...@redhat.com, paolo.carl...@oracle.com This is a place-holder entry as a reminder to fix http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1402 The following example should be well-formed when compiled in C++11 mode, but is currently not (tested with gcc 4.8.0 20120610 (experimental)): template<typename T> struct wrap { wrap() = default; wrap(wrap&&) = default; // Line 5 wrap(const wrap&) = default; T t; }; struct S { S() = default; S(const S&){} S(S&&) = default; }; typedef wrap<const S> W; W get() { return W(); } // Line 19 int main() {} "In function 'W get()':| 19|error: use of deleted function 'wrap<T>::wrap(wrap<T>&&) [with T = const S]'| 5|note: 'wrap<T>::wrap(wrap<T>&&) [with T = const S]' is implicitly deleted because the default definition would be ill-formed:| 5|error: non-static data member 'wrap<const S>::t' does not have a move constructor or trivial copy constructor|"