Я пытаюсь вернуть член std::unique_ptr class
(пытающийся переместить право собственности) на вызывающего. Ниже приведен пример фрагмента кода:
class A {
public:
A() : p {new int{10}} {}
static std::unique_ptr<int> Foo(A &a) {
return a.p; // ERROR: Copy constructor getting invoked
// return std::move(a.p); WORKS FINE
}
std::unique_ptr<int> p;
};
Я думал, что компилятор (gcc-5.2.1) сможет в этом случае сделать оптимизацию возвращаемого значения (copy elision), не требуя явного намерения через std::move()
. Но это не так. Почему бы и нет?
Следующий код, кажется, работает нормально, что кажется эквивалентным:
std::unique_ptr<int> foo() {
std::unique_ptr<int> p {new int{10}};
return p;
}