我只能访问C 03,而且我经常想要将一个向量移动到一个函数中,就像你在C 11中那样.这个问题如何做到不要过多地混淆代码的用户.所以我的问题是程序员在C 11之前是如何做到的.
我知道可以使用交换功能“移动”向量.所以这就是我想出的:
class Foo { public: Foo(std::vector<int>& vec) { using std::swap; swap(vec,m_vec); // "move" vec into member vector } private: std::vector<int> m_vec; }; // usage: std::vector<int> v(100,1337); Foo foo(v); // v.empty() == true
解决方法
您可以定义包装引用的类型和包装它的函数,以提供类似于在调用站点移动语义的类型.有点像
template <typename T> struct move_ref { explicit move_ref(T & ref) : ref(ref) {} T & ref; }; template <typename T> move_ref<T> move(T & t) {return move_ref<T>(t);} Foo(move_ref< std::vector<int> > vec) { using std::swap; swap(vec.ref,m_vec); // "move" vec into member vector } Foo foo(move(v));
或者,Boost有一个library允许移动语义而没有C 11.