mirror of
https://github.com/boostorg/core.git
synced 2025-07-30 04:47:24 +02:00
Merge branch 'develop'
This commit is contained in:
@ -141,15 +141,6 @@ template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref( T
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
@return `ref(t.get())`
|
|
||||||
@remark Does not throw.
|
|
||||||
*/
|
|
||||||
template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref( reference_wrapper<T> t )
|
|
||||||
{
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cref
|
// cref
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -161,15 +152,6 @@ template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST c
|
|||||||
return reference_wrapper<T const>(t);
|
return reference_wrapper<T const>(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
@return `cref(t.get())`
|
|
||||||
@remark Does not throw.
|
|
||||||
*/
|
|
||||||
template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST cref( reference_wrapper<T> t )
|
|
||||||
{
|
|
||||||
return reference_wrapper<T const>(t.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef BOOST_REF_CONST
|
#undef BOOST_REF_CONST
|
||||||
|
|
||||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
//
|
//
|
||||||
// Test for ref(ref(x))
|
// Test that ref(ref(x)) does NOT collapse to ref(x)
|
||||||
|
//
|
||||||
|
// This irregularity of std::ref is questionable and breaks
|
||||||
|
// existing Boost code such as proto::make_expr
|
||||||
//
|
//
|
||||||
// Copyright 2014 Peter Dimov
|
// Copyright 2014 Peter Dimov
|
||||||
//
|
//
|
||||||
@ -11,28 +14,50 @@
|
|||||||
#include <boost/ref.hpp>
|
#include <boost/ref.hpp>
|
||||||
#include <boost/core/lightweight_test.hpp>
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
|
||||||
|
template<class T> void test( T const & t )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
boost::reference_wrapper< T const > r = boost::ref( t );
|
||||||
|
BOOST_TEST_EQ( &r.get(), &t );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::reference_wrapper< T const > r = boost::cref( t );
|
||||||
|
BOOST_TEST_EQ( &r.get(), &t );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> void test_nonconst( T & t )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
boost::reference_wrapper< T > r = boost::ref( t );
|
||||||
|
BOOST_TEST_EQ( &r.get(), &t );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::reference_wrapper< T const > r = boost::cref( t );
|
||||||
|
BOOST_TEST_EQ( &r.get(), &t );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
|
|
||||||
|
test( x );
|
||||||
|
test( boost::ref( x ) );
|
||||||
|
test( boost::cref( x ) );
|
||||||
|
|
||||||
|
test_nonconst( x );
|
||||||
|
|
||||||
{
|
{
|
||||||
boost::reference_wrapper< int > r = boost::ref( boost::ref( x ) );
|
boost::reference_wrapper< int > r = boost::ref( x );
|
||||||
BOOST_TEST_EQ( &r.get(), &x );
|
test_nonconst( r );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boost::reference_wrapper< int const > r = boost::ref( boost::cref( x ) );
|
boost::reference_wrapper< int const > r = boost::cref( x );
|
||||||
BOOST_TEST_EQ( &r.get(), &x );
|
test_nonconst( r );
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
boost::reference_wrapper< int const > r = boost::cref( boost::ref( x ) );
|
|
||||||
BOOST_TEST_EQ( &r.get(), &x );
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
boost::reference_wrapper< int const > r = boost::cref( boost::cref( x ) );
|
|
||||||
BOOST_TEST_EQ( &r.get(), &x );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
|
Reference in New Issue
Block a user