Namespaces
Variants

C++ named requirements: MoveConstructible (since C++11)

From cppreference.net
C++ named requirements

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

Содержание

Требования

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

Дано

  • rv , rvalue -выражение типа T ,
  • u , произвольный идентификатор.

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

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

Новое значение rv не определено.

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

Новое значение rv не определено.

Примечания

Классу не обязательно реализовывать move constructor для удовлетворения этому требованию типа: copy constructor принимающий аргумент const T& может связывать rvalue выражения.

Если класс MoveConstructible реализует перемещающий конструктор, он также может реализовать семантику перемещения , чтобы воспользоваться тем фактом, что значение rv после конструирования не определено.

Расширенное содержимое

Быть классом MoveConstructible подразумевает std::is_move_constructible , но не наоборот, поскольку std::is_move_constructible проверяет только возможность вызова конструктора с правильными аргументами, а не постусловие значения.

#include <iostream>
struct S
{
    int n;
    S(int in) : n{in} {}
    S(S&& other) { n = other.n + 1; }
};
static_assert(std::is_move_constructible_v<S>);
int main()
{
    S v{1};
    std::cout << "v.n = " << v.n << '\n';
    S u = std::move(v);
    // Class `S` doesn't satisfy a MoveConstructible requirement
    // The value of `u` is NOT equivalent to the value of `v` before the `u` initialization
    std::cout << "u.n = " << u.n << '\n';
}

Вывод:

v.n = 1
u.n = 2

Ссылки

Расширенное содержимое
  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 16.4.4.2 Требования к шаблонным аргументам [utility.arg.requirements]

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

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