|
|
|
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] |