
David Abrahams wrote:
Daniel Wallin <dalwan01@student.umu.se> writes:
One thing I think we overlooked in the move proposal, though, is the fact that "only movable and not copyable" class rvalues *still* can't legally be passed where a const reference is expected, unless the rule in question is lifted. That seems like a problem to me.
That is true if the class would declare regular move constructors with rvalue references. But doesn't the trick used to implement move_ptr apply with the new rvalue references as well? (moving with const& constructor)
X x; X y(static_cast<X&&>(x)); // should bind to X(X const&) and not // generate an error?
So technically the rule doesn't need to be lifted if we get rvalue references.
OK, you're right. But that's really awful. :(.
Yeah it would be best if the rule could be lifted, but it isn't really *that* bad: template<class T, class U> struct enable_only_move; template<class T> struct enable_only_move<T, const T> { typedef typename T::error type; }; template<class T> struct enable_only_move<T, T> { typedef int type; }; // only movable class X { public: X() {} X(X const&) {} X& operator=(X) {} private: template<class U> X(U&, typename enable_only_move<X, U>::type = 0); }; -- Daniel Wallin