std::move_if_noexcept
定义如下(C ++ 11 20.2.3 / 7-8):
template <class T>
typename conditional<!is_nothrow_move_constructible<T>::value
&& is_copy_constructible<T>::value,
const T&,
T&&
>::typemove_if_noexcept(T& x) noexcept;
Returns: std::move(x)
简单地说,如果move_if_noexcept(x)
的移动构造函数没有抛出或x
不是可复制构造的,x
会将x
强制转换为右值。这让我想知道是否有任何常见的类型不可复制,但其移动构造函数可能会抛出。
在标准库中,我检查了不可复制的类型unique_ptr
,future
,promise
,各种互斥锁类型,unique_lock
,condition_variable
,和packaged_task
,除非我误读了标准,否则他们都会宣布他们的移动操作noexcept
。
标准库(C ++ 11或C ++ 14)或常用的第三方库(例如Boost)中是否存在仅移动类型,其中移动操作可能会抛出?
答案 0 :(得分:3)
fstream类是移动构造函数的示例,未声明noexcept并删除了复制构造函数:http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream