我对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中创建的临时)。不复制/移动其字段,而是使其成为成员。
答案 0 :(得分:0)
您不能在类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;
}