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;
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
|
||||
|
@ -45,6 +45,7 @@ import testing ;
|
||||
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
|
||||
[ run spinlock_pool_test.cpp ]
|
||||
[ run make_shared_test.cpp ]
|
||||
[ run make_shared_perfect_forwarding_test.cpp ]
|
||||
[ run sp_convertible_test.cpp ]
|
||||
[ run wp_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