PTR <T >>

Foo类有一个右值引用构造函数,用于移动unique_ptr所包含的向量,那么为什么下面的代码会给出以下错误:无论是否在main中的Foo()上都有std :: move?

错误1错误C2280:'std :: unique_ptr>&std :: unique_ptr <_Ty,std :: default_delete <_Ty >> :: operator =(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)' :尝试引用已删除的函数

class Foo{
public:
    Foo(){

    }
    Foo(Foo&& other) :
        m_bar(std::move(other.m_bar))
    {};

    std::vector<std::unique_ptr<SomeThing>> m_bar;
};

int main(int argc, char* argv[])
{
    Foo f;
    f = std::move(Foo());
    return 0;
}

这个:

 f = std::move(Foo());

不会调用移动构造函数。 它调用移动赋值操作符。 此外,它是多余的,因为Foo()已经是一个右值,所以它相当于:

f = Foo();

既然你声明了一个移动构造函数,移动赋值操作符没有被声明 - 所以没有一个。 所以你要么提供一个:

Foo& operator=(Foo&& other) {
    m_bar = std::move(other.m_bar);
    return *this;
}

或者,由于所有成员都自己实现移动操作,因此可以删除移动构造函数,并依赖编译器生成的隐式移动构造函数和移动赋值。

链接地址: http://www.djcxy.com/p/59679.html

上一篇: ptr<T>>

下一篇: Emulating explicit cast in C++03