Boost C++ Libraries 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_assignable : public true_type-or-false_type {};

Inherits: If T is CopyAssignable (i.e. has an accessible explicit or implicit copy assignment operator), 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 assignment of T from const T & is not marked with = delete, T does not derives from boost::noncopyable and is not marked with BOOST_MOVABLE_BUT_NOT_COPYABLE(T).

Compiler Compatibility: Requires the C++11 features decltype and SFINAE-expressions for full support.

If your compiler does not support C++11 deleted functions (= delete) or does not support SFINAE for the deleted assignments, then derive your classes from boost::noncopyable or mark them with BOOST_MOVABLE_BUT_NOT_COPYABLE(T) to show that class is non-assignable.

Trait does not care about access modifiers, so if you see errors like this:

'T::operator=(const T&)' is private
boost/type_traits/is_copy_assignable.hpp:68:5: error: within this context

then you are trying to call that macro for a structure with private assignment:

struct T {
    // ...
    T &operator=(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 specializing the trait.

Header: #include <boost/type_traits/is_copy_assignable.hpp> or #include <boost/type_traits.hpp>