C++ named requirements: CopyConstructible
Указывает, что экземпляр типа может быть копированным из lvalue выражения .
Содержание |
Требования
Тип
T
удовлетворяет требованиям
CopyConstructible
если
-
Тип
Tудовлетворяет требованиям MoveConstructible , и
Дано
-
v
, lvalue-выражение типа
Tили const T , либо rvalue-выражение типа const T , - u , произвольный идентификатор.
Следующие выражения должны быть корректными и иметь указанные эффекты:
| Выражение | Постусловия |
|---|---|
| T u = v ; |
Значение
u
эквивалентно значению
v
.
Значение v не изменяется. |
| T ( v ) |
Значение
T
(
v
)
эквивалентно значению
v
.
Значение v не изменяется. |
|
Выражение
v.~T
(
)
также должно быть валидным, и, для lvalue
v
, выражение
&
v
должно иметь тип
|
(until C++11) |
Примечания
До C++11 классы, которые перегружали operator & , не были CopyConstructible и поэтому не могли использоваться в контейнерах стандартной библиотеки . Это было дизайнерское решение в C++98 (а не дефект, см. LWG issue 390 ).
Начиная с C++11, стандартная библиотека использует std::addressof всякий раз, когда требуется адрес объекта.
| Расширенное содержимое |
|---|
|
Быть классом CopyConstructible подразумевает std::is_copy_constructible , но не наоборот, поскольку std::is_copy_constructible проверяет только возможность вызова конструктора с правильными аргументами, и, например, не требует выполнения MoveConstructible требования.
Запустить этот код
#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++20)
|
указывает, что объект типа может быть скопирован и перемещен
(концепт) |