Defined in header <utility>
template< class T >

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

>::type move_if_noexcept(T& x);
(since C++11)

Obtains an rvalue reference to its argument if its move constructor does not throw exceptions, otherwise obtains an lvalue reference to its argument. Typically used to combine move semantics with strong exception guarantee.

For example, std::vector::resize() allocates new storage, and then moves or copies elements from old storage to new storage. If an exception occurs during this, 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.


[edit] Parameters

x - the object to be moved or copied

[edit] Return value

std::move(x) or x, depending on exception guarantees.

[edit] Exceptions

noexcept specification:  
  (since C++11)

[edit] Example

#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

[edit] Complexity


[edit] See also

forwards a function argument
(function template)
obtains an rvalue reference
(function template)