
2009/1/8 Howard Hinnant <hinnant@twcny.rr.com>:
Is it practical to do this instead?
class vector { void push_back(value_type x); // internally move construct from x }
I was doing this (which is inspired by either Adobe or David Abrahams): template <class U> void push_back(U const& x, typename boost::copy_sink<U, T>::type = 0) { if(data_.end_ == data_.storage_end_) resize(data_.begin_ ? size() * 2 : 4); std::uninitialized_fill_n(data_.end_, 1, x); ++data_.end_; } #if !defined(BOOST_NO_SFINAE) template <class U> void push_back(U x, typename boost::move_sink<U, T>::type = 0) { if(data_.end_ == data_.storage_end_) resize(data_.begin_ ? size() * 2 : 4); data_.end_ = boost::uninitialized_move(&x, &x + 1, data_.end_); } #endif This is taken from: http://svn.boost.org/svn/boost/sandbox/move/libs/move/test/vector.hpp The move header is at: http://svn.boost.org/svn/boost/sandbox/move/boost/move/move.hpp It is worth looking at (I can say that objectively as it's mostly based on other people's ideas). For emplace, you'd probably only want to do this for a small number of arguments. Daniel