Именованные требования C++: CopyConstructible
Задает, что экземпляр типа можно скопировать конструированием из выражения lvalue.
Требования
Тип T удовлетворяет требованиям CopyConstructible, если
- Тип
Tудовлетворяет требованиям MoveConstructible, и
Для
-
v, выражения lvalue типаTили constT либо выражения rvalue типа constT, -
u, произвольного идентификатора.
Следующие выражения должны быть допустимы и иметь указанные эффекты:
| Выражение | Постусловия |
|---|---|
T u = v; | Значение u эквивалентно значению v. Значение |
T(v) | Значение T(v) эквивалентно значению v. Значение |
| Выражение | (до C++11) |
Примечания
До C++11 классы, перегружавшие operator&, не удовлетворяли требованиям CopyConstructible и поэтому не могли использоваться в контейнерах стандартной библиотеки. Это было решением при разработке C++98, а не дефектом (см. предложение LWG 390).
Начиная с C++11 стандартная библиотека использует std::addressof всякий раз, когда требуется адрес объекта.
| Дополнительная информация |
|---|
| Из того, что класс удовлетворяет требованиям CopyConstructible, следует #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
}
|
Ссылки
| Дополнительная информация |
|---|
|
См. также
|
(C++11)(C++11)(C++11) | проверяет, есть ли у типа конструктор копирования (шаблон класса) |
|
(C++26)(C++26)(C++26) | проверяет, есть ли у отраженного типа конструктор копирования (функция) |
|
(C++20) | задает, что объект типа можно сконструировать копированием и перемещением (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/CopyConstructible