Некоторые типы не поддаются копированию семантики, но все же могут быть сделаны подвижными. Например:
- <
unique_ptr
>(нераздельное, некопируемое право собственности) - Тип, представляющий нить исполнения
- Тип, представляющий дескриптор файла
Делая такие типы подвижными (хотя все еще не копируемыми), их полезность значительно увеличивается. Подвижные, но некопируемые типы могут быть возвращены по стоимости из заводских функций:
file_descriptor create_file(/* ... */);
file_descriptor data_file;
data_file = create_file(/* ... */);
В приведенном выше примере, лежащая в основе ручка файла передается от объекта к объекту, если источник<file_descriptor
>является значением r. Во все времена существует только одна базовая ручка файла, и только один<file_descriptor
>владеет ею одновременно.
Чтобы написать подвижный, но не копируемый тип в портативном синтаксисе, необходимо выполнить следующие простые действия:
Вот определение<filedescriptor
>с использованием портативного синтаксиса:
#include <boost/move/utility_core.hpp>
#include <stdexcept>
class file_descriptor
{
int os_descr_;
private:
BOOST_MOVABLE_BUT_NOT_COPYABLE(file_descriptor)
public:
explicit file_descriptor(const char *filename)
: os_descr_(operating_system_open_file(filename))
{ if(!os_descr_) throw std::runtime_error("file not found"); }
~file_descriptor()
{ if(os_descr_) operating_system_close_file(os_descr_); }
file_descriptor(BOOST_RV_REF(file_descriptor) x)
: os_descr_(x.os_descr_)
{ x.os_descr_ = 0; }
file_descriptor& operator=(BOOST_RV_REF(file_descriptor) x)
{
if(os_descr_) operating_system_close_file(os_descr_);
os_descr_ = x.os_descr_;
x.os_descr_ = 0;
return *this;
}
bool empty() const { return os_descr_ == 0; }
};