是否可以使用右值来初始化数据成员?
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;
}
我对 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;
}