Boost logo

Boost :

Subject: Re: [boost] [move] problem with msvc and BOOST_MOVABLE_BUT_NOT_COPYABLE
From: Ilya Sokolov (ilyasokol_at_[hidden])
Date: 2010-05-28 17:30:40


Ion Gaztañaga wrote:
> On 28/05/2010 21:27, Ilya Sokolov wrote:
>> X(const X&) = delete;
>> X& operator=(const X&) = delete;
>
> Ok, but we are talking about rvalue references and asking if Boost.Move
> provokes some late error report. It's a shame we can't provoke a
> compilation error always (even with NVRO, I thought the compiler should
> check for the copy constructor, but I'm not an expert),

I'm not an expert either, but 12.2/1 of 14882:2003 clearly says so.
AFAIR, msvc doesn't check.

> but that's the best we can do.

template<class TYPE>
class movable_but_not_copyable
{
    TYPE(TYPE &);
    TYPE& operator=(TYPE &);
public:
    operator ::BOOST_MOVE_NAMESPACE::rv<TYPE>&();
    operator const ::BOOST_MOVE_NAMESPACE::rv<TYPE>&() const;
};

// from the original example

class X : public movable_but_not_copyable
{ /*...*/ };

X X::create()
{
     X x;
     return x; // compile-time error

What do you think?

Or even

class noncopyable
{
   // note: non-const ref
   noncopyable(noncopyable&);
   noncopyable& operator=(noncopyable&);
};

template<class TYPE>
struct movable
{
    operator ::BOOST_MOVE_NAMESPACE::rv<TYPE>&();
    operator const ::BOOST_MOVE_NAMESPACE::rv<TYPE>&() const;
};


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk