|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Specifies that an instance of the type can be copy-constructed from anlvalue expression.
Contents |
The typeT satisfiesCopyConstructible if
T satisfiesMoveConstructible, andGiven
T orconst T or anrvalue expression of typeconst T,The following expressions must be valid and have their specified effects:
| Expression | Post-conditions |
|---|---|
| T u= v; | The value ofu is equivalent to the value ofv. The value ofv is unchanged. |
| T(v) | The value ofT(v) is equivalent to the value ofv. The value ofv is unchanged. |
The expressionv.~T() also must be valid, and, for lvaluev, the expression&v must have the type | (until C++11) |
Until C++11, classes that overloadedoperator& were notCopyConstructible and thus were not usable in thestandard library containers. This is a design decision in C++98 (instead of a defect, seeLWG issue 390).
Since C++11, the standard library usesstd::addressof whenever the address of an object is needed.
| Extended content |
|---|
Being aCopyConstructible class impliesstd::is_copy_constructible but not vice versa sincestd::is_copy_constructible will only check for the ability to call the constructor with the correct arguments, and, e.g., not aMoveConstructible 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} |
| Extended content |
|---|
|
(C++11)(C++11)(C++11) | checks if a type has a copy constructor (class template)[edit] |
(C++20) | specifies that an object of a type can be copy constructed and move constructed (concept)[edit] |