Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

Указывает, что экземпляр типа может быть копированным из lvalue выражения .

Содержание

Требования

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

Дано

  • 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 должно иметь тип T* или const T * и должно вычисляться в адрес 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++23 (ISO/IEC 14882:2024):
  • 16.4.4.2 Требования к шаблонным аргументам [utility.arg.requirements]

Смотрите также

проверяет, имеет ли тип конструктор копирования
(шаблон класса)
указывает, что объект типа может быть скопирован и перемещен
(концепт)