Пространства имён
Варианты
Действия

std::move_if_noexcept

Материал из cppreference.com
< cpp‎ | utility

Определено в заголовочном файле <utility>
template< class T >

typename std::conditional<
    !std::is_nothrow_move_constructible<T>::value && std::is_copy_constructible<T>::value,
    const T&,
    T&&

>::type move_if_noexcept(T& x);
(начиная с C++11)
move_if_noexcept получает RValue ссылкой на свои аргументы, если ее движение конструктор не бросать исключения, в противном случае получает ссылку именующее своих аргументов. Как правило, используется для объединения семантика переноса с сильной гарантией исключения.
Оригинал:
move_if_noexcept obtains an rvalue reference to its argument if its move constructor does not throw exceptions, otherwise obtains an lvalue reference to its argument. It is typically used to combine move semantics with strong exception guarantee.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Например, std::vector::resize иногда выделяет новое хранилище, а затем перемещает или копирует элементы из старого хранение в новое хранилище. Если исключение возникает во время этой операции, std::vector::resize отменяет все, что он сделал с этой точки, которая возможна только при std::move_if_noexcept был использован для решить, использовать ли строительство перемещать или копировать строительства.
Оригинал:
For example, std::vector::resize occasionally allocates new storage and then moves or copies elements from old storage to new storage. If an exception occurs during this operation, std::vector::resize undoes everything it did to this point, which is only possible if std::move_if_noexcept was used to decide whether to use move construction or copy construction.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Параметры

x -
Объект будет перемещен или скопирован
Оригинал:
the object to be moved or copied
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Возвращаемое значение

std::move(x) или x, в зависимости от исключения гарантий.
Оригинал:
std::move(x) or x, depending on exception guarantees.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Исключения

noexcept-спецификация:  
noexcept
  (начиная с C++11)

[править] Пример

#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&) {};
};
 
int main()
{
    Good g;
    Bad b;
    Good g2 = std::move_if_noexcept(g);
    Bad b2 = std::move_if_noexcept(b);
}

Вывод:

Non-throwing move constructor called
Throwing copy constructor called

[править] Сложность

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

[править] См. также

(C++11)
Вперед аргумента функции
Оригинал:
forwards a function argument
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [edit]
(C++11)
получает RValue ссылки
Оригинал:
obtains an rvalue reference
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [edit]