...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
template <class T>
struct is_copy_constructible : public true_type-or-false_type
{};
Inherits: If T
is a (possibly cv-qualified) type with a copy constructor, then inherits
from true_type,
otherwise inherits from false_type.
Type T
must be a complete
type.
In other words, inherits from true_type
only if copy constructor of T
not marked with = delete
,
T
does not derives from
boost::noncopyable
and does not marked with BOOST_MOVABLE_BUT_NOT_COPYABLE(T)
.
Compiler Compatibility: This trait requires
the C++11 features decltype
and SFINAE-expression support for full support.
If your compiler does not support C++11 deleted functions (= delete
)
or does not support SFINAE for the deleted constructors, then derive your
classes from boost::noncopyable
or mark them with BOOST_MOVABLE_BUT_NOT_COPYABLE(T)
to show
that class is noncopyable.
The trait does not care about access modifiers, so if you see errors like this:
'T::T(const T&)' is private boost/type_traits/is_copy_constructible.hpp:68:5: error: within this context
then you are trying to call that macro for a structure with private constructor:
struct T { // ... private: T(const T &); // ... };
To fix that you must modify your structure, explicitly marking it as noncopyable
(= delete
,
boost::noncopyable
or BOOST_MOVABLE_BUT_NOT_COPYABLE(T)
)
or explicitly specialize trait.
Header: #include
<boost/type_traits/is_copy_constructible.hpp>
or #include <boost/type_traits.hpp>