C++ named requirements: CopyConstructible
Specifies that an instance of the type can be copy-constructed from an lvalue expression.
Requirements
The type T satisfies CopyConstructible if
- The type
Tsatisfies MoveConstructible, and
Given
v, an lvalue expression of typeTorconst Tor an rvalue expression of typeconst T,u, an arbitrary identifier.
The following expressions must be valid and have their specified effects:
| Expression | Post-conditions |
|---|---|
T u = v;
|
The value of u is equivalent to the value of v.
The value of |
T(v)
|
The value of T(v) is equivalent to the value of v.
The value of |
|
The expression |
(until C++11) |
Notes
Until C++11, classes that overloaded operator& were not CopyConstructible and thus were not usable in the standard library containers. This is a design decision in C++98 (instead of a defect, see LWG issue 390).
Since C++11, the standard library uses std::addressof whenever the address of an object is needed.
| Extended content |
|---|
|
Being a CopyConstructible class implies std::is_copy_constructible but not vice versa since std::is_copy_constructible will only check for the ability to call the constructor with the correct arguments, and, e.g., not a MoveConstructible requirement. Run this code #include <type_traits>
#include <utility>
struct S
{
S() = default;
S(S&&) = delete;
S(const S&) = default;
};
static_assert(std::is_copy_constructible_v<S>);
int main()
{
S s1;
// Class `S` doesn't satisfy MoveConstructible requirement,
// hence doesn't satisfy CopyConstructible requirement
[[maybe_unused]] S s2{std::move(s1)}; // ill-formed, use of deleted function
}
|
References
| Extended content |
|---|
|
See also
(C++11)(C++11)(C++11) |
checks if a type has a copy constructor (class template) |
(C++20) |
specifies that an object of a type can be copy constructed and move constructed (concept) |