Spec-Zone.ru › C++

std::move_if_noexcept

Определено в заголовочном файле <utility>
template< class T >
/* see below */ move_if_noexcept( T& x ) noexcept;
(начиная с C++11)
(constexpr начиная с C++14)

std::move_if_noexcept получает rvalue-ссылку на свой аргумент, если его конструктор перемещения не генерирует исключений или если конструктор копирования отсутствует (тип, поддерживающий только перемещение); в противном случае получает lvalue-ссылку на свой аргумент. Обычно используется для сочетания семантики перемещения с гарантией строгой безопасности исключений.

Возвращаемый тип std::move_if_noexcept:

  • T&&, если std::is_nothrow_move_constructible<T>::value || !std::is_copy_constructible<T>::value является true.
  • В противном случае — const T&.

Параметры

x - объект для перемещения или копирования

Возвращаемое значение

std::move(x) или x, в зависимости от гарантий безопасности исключений.

Сложность

Константная.

Примечания

Эта функция используется, например, в std::vector::resize, которому может потребоваться выделить новое хранилище, а затем переместить или скопировать элементы из старого хранилища в новое. Если во время этой операции возникает исключение, std::vector::resize отменяет все выполненные к этому моменту действия. Это возможно только в том случае, если для выбора конструктора перемещения или конструктора копирования использовался std::move_if_noexcept (если только конструктор копирования недоступен: в этом случае в любом случае используется конструктор перемещения, и от строгой гарантии безопасности исключений можно отказаться).

Пример

#include <iostream>
#include <utility>

struct Bad
{
    Bad() {}
    Bad(Bad&&) // may throw
    {
        std::cout << "Throwing move constructor called\n";
    }
    Bad(const Bad&) // may throw as well
    {
        std::cout << "Throwing copy constructor called\n";
    }
};

struct Good
{
    Good() {}
    Good(Good&&) noexcept // will NOT throw
    {
        std::cout << "Non-throwing move constructor called\n";
    }
    Good(const Good&) noexcept // will NOT throw
    {
        std::cout << "Non-throwing copy constructor called\n";
    }
};

int main()
{
    Good g;
    Bad b;
    [[maybe_unused]] Good g2 = std::move_if_noexcept(g);
    [[maybe_unused]] Bad b2 = std::move_if_noexcept(b);
}

Вывод:

Non-throwing move constructor called
Throwing copy constructor called

См. также

forward
(C++11)
пересылает аргумент функции, используя аргумент шаблона типа для сохранения категории значения
(шаблон функции)
move
(C++11)
преобразует аргумент в xvalue
(шаблон функции)

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

Spec-Zone.ru

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