Here's another use case that fails to compile in C++03 but compiles
successfully in C++11. (Note, it fails to compile in VS2005 and g++ 4.8.2
-std=c++98, and compiles successfully with g++ 4.8.2 -std=c++11)
MOC is a BOOST_MOVABLE_BUT_NOT_COPYABLE type. Foo is an empty with an
implicit conversion function to MOC. "MOC m(Foo());" compiles successfully
but "MOC m2(makeFoo());" fails to compile. Is this a bug or a limitation
of Boost.Move in C++03?
//----------
//Start Code
//----------
#include
#include
struct MOC
{
MOC() : value(121) {}
MOC(BOOST_RV_REF(MOC) rhs) : value(rhs.value) {}
int value;
private:
BOOST_MOVABLE_BUT_NOT_COPYABLE(MOC)
};
struct Foo
{
operator MOC ()
{
return MOC();
}
};
Foo makeFoo()
{
return Foo();
}
int main()
{
// (1) Successfully Compiles.
MOC m(Foo());
// (2) Fails to Compile.
MOC m2(makeFoo());
return 0;
}
//--------
//End Code
//--------
//--------------------
//Start Error Messages
//--------------------
boost_move_implicit_conversion_to_rvalue.cc: In function ‘int main()’:
boost_move_implicit_conversion_to_rvalue.cc:32:19: error: no matching
function for call to ‘MOC::MOC(Foo)’
MOC m2(makeFoo());
^
boost_move_implicit_conversion_to_rvalue.cc:32:19: note: candidates are:
boost_move_implicit_conversion_to_rvalue.cc:10:3: note: MOC::MOC(MOC&)
BOOST_MOVABLE_BUT_NOT_COPYABLE(MOC)
^
boost_move_implicit_conversion_to_rvalue.cc:10:3: note: no known
conversion for argument 1 from ‘Foo’ to ‘MOC&’
boost_move_implicit_conversion_to_rvalue.cc:7:3: note:
MOC::MOC(boost::rv<MOC>&)
MOC(BOOST_RV_REF(MOC) rhs) : value(rhs.value) {}
^
boost_move_implicit_conversion_to_rvalue.cc:7:3: note: no known
conversion for argument 1 from ‘Foo’ to ‘boost::rv<MOC>&’
boost_move_implicit_conversion_to_rvalue.cc:6:3: note: MOC::MOC()
MOC() : value(121) {}
^
boost_move_implicit_conversion_to_rvalue.cc:6:3: note: candidate expects
0 arguments, 1 provided
//------------------
//End Error Messages
//------------------