是否可以使用右值初始化数据成员?

Is it possible use an rvalue to initialize a data member?

本文关键字:初始化 数据成员 可以使 是否      更新时间:2023-10-16

我对 r 值引用和移动语义很陌生,但我读过的教程的态度是"既然临时是一个构造良好的对象,通常会被复制和销毁,为什么不延长它的生命周期并移动它呢?

所以我正在想象这样的场景:

class Foo
{
Foo m_foo; // Could also be a reference or a unique_ptr of any sort
public:
Foo() {}
Foo(Foo &&v_foo) { /*initialize m_foo using v_foo.*/ }
};
int main() 
{
auto foo = std::make_unique<Foo>( Foo() );
return 1;
}

这样的事情可能吗?

更新:为了澄清起见,当我说"使用 v_foo 初始化m_foo"时,我的意思是我希望m_foo指向或引用v_foo对象(在 main 中创建的临时对象(。不复制/移动其字段,而是使其成为成员。

不能将类型Foo的数据成员保留在类Foo中,因为该对象将无限大(因为每个Foo类型的对象内部都有另一个Foo对象,该内部对象内部将具有另一个Foo对象,依此类推。

通过此更改,您可以拥有如下所示的内容:

class Foo
{
std::unique_ptr<Foo> m_foo; 
public:
Foo() {}
Foo(Foo &&v_foo) 
{ 
m_foo = std::move(v_foo.m_foo); 
v_foo.m_foo = nullptr;
}
};
int main()
{
auto foo = std::make_unique<Foo>(Foo());
return 0;
}