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

时间:2020-06-14 09:59:24

标签: c++ c++14 unique-ptr move-semantics rvalue-reference

我对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中创建的临时)。不复制/移动其字段,而是使其成为成员。

1 个答案:

答案 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;
}