Boost logo

Boost :

From: Daniel Wallin (dalwan01_at_[hidden])
Date: 2004-02-09 12:18:45

David Abrahams wrote:
> Daniel Wallin <dalwan01_at_[hidden]> 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&
>> 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
> 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
       X() {}
       X(X const&) {}
       X& operator=(X) {}

       template<class U>
       X(U&, typename enable_only_move<X, U>::type = 0);

Daniel Wallin

Boost list run by bdawes at, gregod at, cpdaniel at, john at