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
См. также
|
(C++11) | пересылает аргумент функции, используя аргумент шаблона типа для сохранения категории значения (шаблон функции) |
|
(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