移动操作可以抛出的仅移动类的示例是什么?

时间:2014-01-31 06:16:15

标签: c++ c++11 move-semantics

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_ptrfuturepromise,各种互斥锁类型,unique_lockcondition_variable,和packaged_task,除非我误读了标准,否则他们都会宣布他们的移动操作noexcept

标准库(C ++ 11或C ++ 14)或常用的第三方库(例如Boost)中是否存在仅移动类型,其中移动操作可能会抛出?

1 个答案:

答案 0 :(得分:3)

fstream类是移动构造函数的示例,未声明noexcept并删除了复制构造函数:http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream