最近在改 XGBoost 的代码。XGBoost 在代码中使用了很多来自 C++11 标准中的特性,让我比较好奇和困惑的,就有其中关于右值引用的部分。涉及到代码里,有比较明显的两类用法:
1 | std::move(foo) |
1 | std::vector<std::unique_ptr<T>> |
前者是使用 std::move 返回 foo 的右值引用;后者则在容器 std::vector 中放入了不可复制只能移动的类的对象(智能指针 std::unique_ptr),当你尝试用常规方法将整个 std::vector 中的元素依次加入另一个 std::vector 的时候,编译器就会报错,提示 std::unique_ptr 的拷贝构造函数是被删除的。
因为好奇和困惑,所以想要把它们搞清楚,于是有了这篇文章。