Boost logo

Boost :

Subject: Re: [boost] boost internal compile problems after moving to 1.44 in VC10
From: Christopher Lux (christopherlux_at_[hidden])
Date: 2010-08-18 09:51:15


2010/8/17 Ion Gaztañaga <igaztanaga_at_[hidden]>:

>> The errors especially are show stoppers here, i am not that into
>> rvalue references yet to see the problems with the templates in
>> boost.interprocess.
>
> Interprocess has not changed for this release, I had no time to update it
> for the release (SVN head is updated though). VC10 is not still supported
> (new move semantics are used by this compiler). You can try to disable
> native rvalue references for this compiler in
>
> boost/interprocess/detail/move.hpp
>
> A quick fix is to replace BOOST_HAS_RVALUE_REFS in this header with another
> non-existing macro.

Hi,
i dug into the move and rvalue issues and found the following:

Everybody knows the following blog entry by Stephan T. Lavavej.

http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

In this post he has an example for move semantics etc. with the
following move template:

template <typename T> typename RemoveReference<T>::type&& Move(T&& t) {
    return t;
}

NOW. I implemented an example very similar to his and got the same
error as in boost.interprocess:

1>e:\...\rvalue_ref_test\main.cpp(34): error C2440: 'return' : cannot
convert from 'rv_test' to 'rv_test &&'
1> You cannot bind an lvalue to an rvalue reference
1> e:\...\rvalue_ref_test\main.cpp(51) : see reference to
function template instantiation 'rv_test &&scm_move<rv_test&>(T)'
being compiled
1> with
1> [
1> T=rv_test &
1> ]

As i dug into the STL that comes with VC10 i found that they implement
the move template as follows:

template<class _Ty> inline typename
tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg)
{
    return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
}

NOW that works, and i am totally pissed off. Why do they publish blog
posts with the correct way to handle it while their compiler requires
a C-style cast in the move template function to get it working?

Steven, i know you read in here. Is there an explanation for this?

P.S. i attached my repo-example.

Regards
-chris




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