forked from boostorg/smart_ptr
Fixed perfect forwarding for make_shared() in trunk, and added
corresponding test. Refs #2962. [SVN r57520]
This commit is contained in:
@ -86,10 +86,12 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template< class T > T forward( T t )
|
#if defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
template< class T > T&& forward( T &&t )
|
||||||
{
|
{
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ import testing ;
|
|||||||
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
|
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
|
||||||
[ run spinlock_pool_test.cpp ]
|
[ run spinlock_pool_test.cpp ]
|
||||||
[ run make_shared_test.cpp ]
|
[ run make_shared_test.cpp ]
|
||||||
|
[ run make_shared_perfect_forwarding_test.cpp ]
|
||||||
[ run sp_convertible_test.cpp ]
|
[ run sp_convertible_test.cpp ]
|
||||||
[ run wp_convertible_test.cpp ]
|
[ run wp_convertible_test.cpp ]
|
||||||
[ run ip_convertible_test.cpp ]
|
[ run ip_convertible_test.cpp ]
|
||||||
|
98
test/make_shared_perfect_forwarding_test.cpp
Normal file
98
test/make_shared_perfect_forwarding_test.cpp
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// make_shared_perfect_forwarding_test.cpp - a test of make_shared
|
||||||
|
// perfect forwarding of constructor arguments when using a C++0x
|
||||||
|
// compiler.
|
||||||
|
//
|
||||||
|
// Copyright 2009 Frank Mori Hess
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
#include <boost/make_shared.hpp>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
#ifndef BOOST_HAS_RVALUE_REFS
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // BOOST_HAS_RVALUE_REFS
|
||||||
|
|
||||||
|
class myarg
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
myarg()
|
||||||
|
{}
|
||||||
|
private:
|
||||||
|
myarg(myarg && other)
|
||||||
|
{}
|
||||||
|
myarg& operator=(myarg && other)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
myarg(const myarg & other)
|
||||||
|
{}
|
||||||
|
myarg& operator=(const myarg & other)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class X
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum constructor_id
|
||||||
|
{
|
||||||
|
move_constructor,
|
||||||
|
const_ref_constructor,
|
||||||
|
ref_constructor
|
||||||
|
};
|
||||||
|
|
||||||
|
X(myarg &&arg): constructed_by_(move_constructor)
|
||||||
|
{}
|
||||||
|
X(const myarg &arg): constructed_by_(const_ref_constructor)
|
||||||
|
{}
|
||||||
|
X(myarg &arg): constructed_by_(ref_constructor)
|
||||||
|
{}
|
||||||
|
|
||||||
|
constructor_id constructed_by_;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Y
|
||||||
|
{
|
||||||
|
Y(int &value): ref(value)
|
||||||
|
{}
|
||||||
|
int &ref;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
myarg a;
|
||||||
|
boost::shared_ptr< X > x = boost::make_shared< X >(a);
|
||||||
|
BOOST_TEST( x->constructed_by_ == X::ref_constructor);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const myarg ca;
|
||||||
|
boost::shared_ptr< X > x = boost::make_shared< X >(ca);
|
||||||
|
BOOST_TEST( x->constructed_by_ == X::const_ref_constructor);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
boost::shared_ptr< X > x = boost::make_shared< X >(myarg());
|
||||||
|
BOOST_TEST( x->constructed_by_ == X::move_constructor);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
int value = 1;
|
||||||
|
boost::shared_ptr< Y > y = boost::make_shared< Y >(value);
|
||||||
|
BOOST_TEST( y->ref == 1 && value == y->ref );
|
||||||
|
++y->ref;
|
||||||
|
BOOST_TEST( value == y->ref );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BOOST_HAS_RVALUE_REFS
|
Reference in New Issue
Block a user