On Mon, 25 Aug 2014 16:18:28 -0700, Peter Dimov
Mostafa wrote:
Then why is it that in C++03 with g++ 4.8.2 the code sample compiles if the copy ctor for Bar is not explicitly defined?
C++03 12.8/5:
The implicitly-declared copy constructor for a class X will have the form X::X(const X&) if — each direct or virtual base class B of X has a copy constructor whose first parameter is of type const B& or const volatile B&, and — for all the nonstatic data members of X that are of a class type M (or array thereof), each such class type has a copy constructor whose first parameter is of type const M& or const volatile M&.107) Otherwise, the implicitly declared copy constructor will have the form X::X(X&)
My guess is that Boost.Move declares Foo's copy constructor to take Foo&. This causes Bar's implicit copy constructor to take Bar&, which doesn't match rvalues.
(Filling in the details.) Ah, so in that case Bar's move ctor is selected: Bar(BOOST_RV_REF(Bar) rhs) : f(::boost::move(rhs.f)) {} because "Bar<Foo>()" is implicitly convertible to BOOST_RV_REF(Bar). Thanks, Mostafa