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

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

我对 r 值引用和移动语义非常陌生,但我读过的教程的态度是 "since the temporary is a perfectly well constructed object that's usually copied and destroyed, why not extend its lifetime and move it around?"

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

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

有这样的可能吗?

更新: 澄清一下,我说 "initialize m_foo using v_foo" 的意思是我想让 m_foo 指向或引用 v_foo 对象(在 main 中创建的临时对象)。不是copy/move它的字段,而是让它成为成员。

您不能在 class 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;
}