From cppreference.com
Specifies that an instance of the type can be copy-constructed from an
.
Requirements
The type T satisfies CopyConstructible if
The type T satisfies
, and
Given
v, an
expression of type T or constT or an
expression of type constT,
u, an arbitrary identifier.
The following expressions must be valid and have their specified effects:
ExpressionPost-conditions Tu=v;The value of u is equivalent to the value of v. The value of v is unchanged.
T(v)The value of T(v) is equivalent to the value of v. The value of v is unchanged.
The expression v.~T() also must be valid, and, for lvalue v, the expression &v must have the type T* or constT* and must evaluate to the address of v.
(until C++11)Notes
Until C++11, classes that overloaded operator& were not CopyConstructible and thus were not usable in the
. This is a design decision in C++98 (instead of a defect, see
).
Since C++11, the standard library uses
whenever the address of an object is needed.
Extended contentBeing a CopyConstructible class implies
but not vice versa since
will only check for the ability to call the constructor with the correct arguments, and, e.g., not a
requirement.
Run this code
#include<type_traits>#include<utility>structS{S()=default;S(S&&)=delete;S(constS&)=default;};static_assert(std::is_copy_constructible_v<S>);intmain(){Ss1;// Class `S` doesn't satisfy MoveConstructible requirement,// hence doesn't satisfy CopyConstructible requirement[[maybe_unused]]Ss2{std::move(s1)};// ill-formed, use of deleted function}References
Extended contentC++23 standard (ISO/IEC 14882:2024):
16.4.4.2 Template argument requirements [utility.arg.requirements]
See also