std::move_if_noexcept
STD:移动[医]如果[医]不,除了
Defined in header | | |
---|---|---|
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 | | (since C++11) (until C++14) |
template< class T > constexpr 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 | | (since C++14) |
move_if_noexcept
如果其移动构造函数不抛出异常,则获取对其参数的rvalue引用,否则将获得对其参数的lvalue引用。它通常用于将移动语义与强异常保证相结合。
参数
x | - | the object to be moved or copied |
---|
返回值
std::move(x)
或x
,取决于例外担保。
例外
noexcept
规格:
noexcept
注记
例如,这是由std::vector::resize
,它可能必须分配新存储,然后将元素从旧存储移动或复制到新存储。如果在此操作期间发生异常,std::vector::resize
取消它在这一点上所做的一切,这只有在以下情况下才有可能std::move_if_noexcept
用于决定是使用移动构造还是复制构造。%28除非没有副本构造函数可用,否则使用移动构造函数,强异常保证可能放弃%29。
例
二次
#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;
Good g2 = std::move_if_noexcept(g
Bad b2 = std::move_if_noexcept(b
}
二次
产出:
二次
Non-throwing move constructor called
Throwing copy constructor called
二次
复杂性
常量。
另见
forward (C++11) | forwards a function argument (function template) |
---|---|
move (C++11) | obtains an rvalue reference (function template) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。