.. _copyable:

**************
meta::copyable
**************

Defined in header ``<mgs/meta/concepts/copyable.hpp>``.

.. code-block:: cpp

   template <typename  T>
   concept copyable =
     meta::copy_constructible<T> &&
     meta::movable<T> &&
     meta::assignable_from<T&, T const&>;

Pre-C++20 implementation of the :concept:`copyable` concept.

----

Concept emulation
=================

.. code-block:: cpp

   namespace mgs {
   namespace meta {

   template <typename T>
   struct is_copyable { /* ... */ };

   template <typename T>
   constexpr auto is_copyable_v = is_copyable<T>::value;

   template <typename T,
             typename = std::enable_if_t<is_copyable_v<T>>>
   using copyable = T;

   } // namespace meta
   } // namespace mgs

Example
=======

.. code-block:: cpp

   #include <mgs/meta/concepts/copyable.hpp>

   using namespace mgs::meta;

   static_assert(is_copyable_v<std::string>, "");
   static_assert(!is_copyable_v<std::string&>, "");

See also
========

* :ref:`assignable_from`
* :ref:`copy_constructible`
* :ref:`movable`