Ion Gaztañaga wrote:
Maybe you should design your code in C++11 and port it to Boost.Move, you might get better compiler help.
His code compiles in C++11, as is. I guess that in C++11 Bar<Foo>() is an rvalue that better matches Bar(Bar&&) than Bar(const &Bar), but with C++98 Bar<Foo>() is an rvalue
Le 25/08/14 23:23, Peter Dimov a écrit : that matches better const &Bar than Bar(rv<Bar>) as the last need a conversion.
If this copy constructor is instantiated, and in many compilers
Bar<Foo> b(( Bar<Foo>() ));
requires the copy constructor, then you get a compilation error. Just try this equivalent (but more inefficient) code:
Bar<Foo> a; Bar<Foo> b(a);
This is not equivalent. a is an lvalue here. In the above code, Bar<Foo>() is an rvalue. It should use the move constructor, not the copy constructor.
Hi, I suspect that Bar copy constructor should be available only if T is copy constructible. Unfortunately I don't know a way to achieve this. Best, Vicente