Ticket #7952: move-doc.patch
File move-doc.patch, 2.9 KB (added by , 10 years ago) |
---|
-
libs/move/example/doc_file_descriptor.cpp
33 33 BOOST_MOVABLE_BUT_NOT_COPYABLE(file_descriptor) 34 34 35 35 public: 36 explicit file_descriptor(const char *filename = 0) // Constructor36 explicit file_descriptor(const char *filename = 0) // Constructor 37 37 : os_descr_(filename ? operating_system_open_file(filename) : 0) 38 { if( !os_descr_) throw std::runtime_error("file not found"); }38 { if(empty()) throw std::runtime_error("file not found"); } 39 39 40 ~file_descriptor() // Destructor41 { if(! os_descr_) operating_system_close_file(os_descr_); }40 ~file_descriptor() // Destructor 41 { if(!empty()) operating_system_close_file(os_descr_); } 42 42 43 43 file_descriptor(BOOST_RV_REF(file_descriptor) x) // Move ctor 44 44 : os_descr_(x.os_descr_) 45 { x.os_descr_ = 0; } 45 { x.os_descr_ = 0; } 46 46 47 47 file_descriptor& operator=(BOOST_RV_REF(file_descriptor) x) // Move assign 48 48 { 49 if(! os_descr_) operating_system_close_file(os_descr_);49 if(!empty()) operating_system_close_file(os_descr_); 50 50 os_descr_ = x.os_descr_; 51 51 x.os_descr_ = 0; 52 52 return *this; … … 61 61 #include <boost/container/vector.hpp> 62 62 #include <cassert> 63 63 64 // Remember: 'file_descriptor' is NOT copyable, but it65 // can be returned from functions thanks to move semantics64 // Remember: 'file_descriptor' is NOT copyable, but it 65 // can be returned from functions thanks to move semantics 66 66 file_descriptor create_file_descriptor(const char *filename) 67 67 { return file_descriptor(filename); } 68 68 69 69 int main() 70 70 { 71 // Open a file obtaining its descriptor, the temporary72 // returned from 'create_file_descriptor' is moved to 'fd'.71 // Open a file obtaining its descriptor, the temporary 72 // returned from 'create_file_descriptor' is moved to 'fd'. 73 73 file_descriptor fd = create_file_descriptor("filename"); 74 74 assert(!fd.empty()); 75 75 76 // Now move fd into a vector76 // Now move fd into a vector. 77 77 boost::container::vector<file_descriptor> v; 78 78 v.push_back(boost::move(fd)); 79 79 80 // Check ownership has been transferred80 // Check ownership has been transferred. 81 81 assert(fd.empty()); 82 82 assert(!v[0].empty()); 83 83 84 // Compilation error if uncommented since file_descriptor is not copyable85 // and vector copy construction requires value_type's copy constructor:86 // boost::container::vector<file_descriptor> v2(v);84 // Compilation error if uncommented since file_descriptor is not copyable 85 // and vector copy construction requires value_type's copy constructor: 86 // boost::container::vector<file_descriptor> v2(v); 87 87 return 0; 88 88 } 89 89 //]