mirror of
https://github.com/boostorg/move.git
synced 2025-10-04 11:40:56 +02:00
Added to trunk
[SVN r70067]
This commit is contained in:
60
example/doc_how_works.cpp
Normal file
60
example/doc_how_works.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (C) Copyright Ion Gaztanaga 2009.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/move for documentation.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_RVALUE_REFERENCES)
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
//[how_works_example
|
||||
#include <boost/move/move.hpp>
|
||||
#include <iostream>
|
||||
|
||||
class sink_tester
|
||||
{
|
||||
public: //conversions provided by BOOST_COPYABLE_AND_MOVABLE
|
||||
operator ::boost::rv<sink_tester>&()
|
||||
{ return *static_cast< ::boost::rv<sink_tester>* >(this); }
|
||||
operator const ::boost::rv<sink_tester>&() const
|
||||
{ return *static_cast<const ::boost::rv<sink_tester>* >(this); }
|
||||
};
|
||||
|
||||
//Functions returning different r/lvalue types
|
||||
sink_tester rvalue() { return sink_tester(); }
|
||||
const sink_tester const_rvalue() { return sink_tester(); }
|
||||
sink_tester & lvalue() { static sink_tester lv; return lv; }
|
||||
const sink_tester & const_lvalue() { static const sink_tester clv = sink_tester(); return clv; }
|
||||
|
||||
//BOOST_RV_REF overload
|
||||
void sink(::boost::rv<sink_tester> &) { std::cout << "non-const rvalue catched" << std::endl; }
|
||||
//BOOST_COPY_ASSIGN_REF overload
|
||||
void sink(const ::boost::rv<sink_tester> &){ std::cout << "const (r-l)value catched" << std::endl; }
|
||||
//Overload provided by BOOST_COPYABLE_AND_MOVABLE
|
||||
void sink(sink_tester &) { std::cout << "non-const lvalue catched" << std::endl; }
|
||||
|
||||
int main()
|
||||
{
|
||||
sink(const_rvalue()); //"const (r-l)value catched"
|
||||
sink(const_lvalue()); //"const (r-l)value catched"
|
||||
sink(lvalue()); //"non-const lvalue catched"
|
||||
sink(rvalue()); //"non-const rvalue catched"
|
||||
return 0;
|
||||
}
|
||||
//]
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user