#include <boost/move/utility_core.hpp>
#include <stdexcept>
class file_descriptor
{
int operating_system_open_file(const char *)
{
return 1;
}
void operating_system_close_file(int)
{}
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))
{
}
~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; }
};
#include <boost/container/vector.hpp>
#include <cassert>
file_descriptor create_file_descriptor(const char *filename)
{ return file_descriptor(filename); }
int main()
{
file_descriptor fd = create_file_descriptor("filename");
assert(!fd.empty());
boost::container::vector<file_descriptor> v;
v.push_back(boost::move(fd));
assert(fd.empty());
assert(!v[0].empty());
return 0;
}