Spec-Zone.ru › C++

Именованные требования C++: MoveConstructible (начиная с C++11)

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

Требования

Тип T удовлетворяет MoveConstructible, если

Даны

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

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

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

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

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

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

Примечания

Класс не обязан реализовывать конструктор перемещения, чтобы удовлетворять этому требованию к типу: конструктор копирования, принимающий аргумент 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]

См. также

is_move_constructibleis_trivially_move_constructibleis_nothrow_move_constructible
(C++11)(C++11)(C++11)
проверяет, может ли тип быть сконструирован из ссылки rvalue
(шаблон класса)
is_move_constructible_typeis_trivially_move_constructible_typeis_nothrow_move_constructible_type
(C++26)(C++26)(C++26)
проверяет, может ли отражённый тип быть сконструирован из ссылки rvalue
(функция)
move_constructible
(C++20)
указывает, что объект типа может быть сконструирован перемещением
(концепт)

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

Spec-Zone.ru

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