unique_ptr
не может быть передан обратно в std::vector
так как он не подлежит копированию, если только не используется std::move
. Однако, если F
- функция, которая возвращает unique_ptr
, то операция std::vector::push_back(F())
разрешена. Ниже приведен пример:
#include <iostream>
#include <vector>
#include <memory>
class A {
public:
int f() { return _f + 10; }
private:
int _f = 20;
};
std::unique_ptr<A> create() { return std::unique_ptr<A>(new A); }
int main() {
std::unique_ptr<A> p1(new A());
std::vector< std::unique_ptr<A> > v;
v.push_back(p1); // (1) This fails, should use std::move
v.push_back(create()); // (2) This doesn't fail, should use std::move?
return 0;
}
(2)
разрешено, но (1)
нет. Это потому, что возвращаемое значение перемещается как-то неявно?
В (2)
действительно ли необходимо использовать std::move
?