std::move_if_noexcept
определяется следующим образом (С++ 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
в rvalue, если x
move constructor не бросает или если x
не является конструктивным. Это заставляет меня задаться вопросом, существуют ли общедоступные типы, которые не могут быть скопированы, но чей конструктор движений может бросить.
В стандартной библиотеке, я проверил uncopyable типы unique_ptr
, future
, promise
, различные типов мьютекса, unique_lock
, condition_variable
и packaged_task
, и, если я не неправильно понимаю стандарт, все они заявляют о своей операции перемещения noexcept
.
Есть ли тип перемещения только в стандартной библиотеке (С++ 11 или С++ 14) или в часто используемой сторонней библиотеке (например, Boost), где могут выполняться операции перемещения?
fstream являются примерами конструктора перемещения, не объявленного noexcept, и конструктор копирования удален: http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream