Я новичок в ссылках на 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;
}

Возможно ли что-нибудь подобное?

0
Nikos Tsakas 14 Июн 2020 в 12:59

2 ответа

Вы не можете сохранить член данных типа 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;
}
0
Gupta 14 Июн 2020 в 19:19

То, что вы ищете, называется конструктором перемещения.

Foo m_foo; не допускается, так как это неполный тип.

Вместо этого вы можете использовать указатель:

Foo* m_foo;
0
Oblivion 14 Июн 2020 в 10:11