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

std::move_if_noexcept

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

 
 
Библиотека утилит
Поддержка языка
Поддержка типа (базовые типы, RTTI, свойства типов)    
Макросы тестирования функциональности библиотеки (C++20)
Управление динамической памятью
Программные утилиты
Обработка ошибок
Поддержка сопрограмм (C++20)
Вариативные функции
(C++17)
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)  
(C++20)
Операции обмена и типа
(C++14)
(C++11)

(C++11)
(C++11)
move_if_noexcept
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

Элементарные преобразования строк
(C++17)
(C++17)

Stacktrace
 
Определено в заголовочном файле <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
  

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

#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)
пересылает аргумент функции
(шаблон функции) [править]
(C++11)
получает ссылку на rvalue
(шаблон функции) [править]