Я новичок в ссылках на 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;
}
Возможно ли что-нибудь подобное?
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;
}
То, что вы ищете, называется конструктором перемещения.
Foo m_foo;
не допускается, так как это неполный тип.
Вместо этого вы можете использовать указатель:
Foo* m_foo;
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .