Spec-Zone.ru › C++

Именованные требования C++: CopyConstructible

Задает, что экземпляр типа можно скопировать конструированием из выражения lvalue.

Требования

Тип T удовлетворяет требованиям CopyConstructible, если

  • Тип T удовлетворяет требованиям MoveConstructible, и

Для

  • v, выражения lvalue типа T или constT либо выражения rvalue типа constT,
  • u, произвольного идентификатора.

Следующие выражения должны быть допустимы и иметь указанные эффекты:

Выражение Постусловия
T u = v; Значение u эквивалентно значению v.

Значение v не изменяется.

T(v) Значение T(v) эквивалентно значению v.

Значение v не изменяется.

Выражение v.~T() также должно быть допустимым, и для lvalue v выражение &v должно иметь тип T* или constT* и вычисляться в адрес v.

(до C++11)

Примечания

До C++11 классы, перегружавшие operator&, не удовлетворяли требованиям CopyConstructible и поэтому не могли использоваться в контейнерах стандартной библиотеки. Это было решением при разработке C++98, а не дефектом (см. предложение LWG 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++23 (ISO/IEC 14882:2024):
    • 16.4.4.2 Требования к аргументам шаблона [utility.arg.requirements]

См. также

is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор копирования
(шаблон класса)
is_copy_constructible_typeis_trivially_copy_constructible_typeis_nothrow_copy_constructible_type
(C++26)(C++26)(C++26)
проверяет, есть ли у отраженного типа конструктор копирования
(функция)
copy_constructible
(C++20)
задает, что объект типа можно сконструировать копированием и перемещением
(концепт)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/CopyConstructible

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API