是否可以使用右值初始化数据成员?
Is it possible use an rvalue to initialize a data member?
我对 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 中创建的临时对象(。不复制/移动其字段,而是使其成为成员。
不能将类型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;
}
相关文章:
- 是否可以使用右值初始化数据成员?
- 扩展初始值设定项列表和未初始化的成员
- 初始化类成员的更好做法是什么?
- 使用 {} 初始化类成员
- 构造函数正在初始化数据成员
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 初始化 const 成员的正确方法
- 初始化数据成员取决于构造函数中的条件
- 获取未初始化对象成员的地址是否定义良好?
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- C - 初始化静态成员的方法
- 使用大型数据集初始化类成员向量的最有效方法
- 如何在C 11中正确初始化数据成员
- 在C++中,如果我们不在构造函数中初始化数据成员,那么类中数据成员的值会是多少
- 为什么我们需要构造函数 C++,我们可以通过函数(初始化数据或访问私有数据成员)来做同样的事情
- 正在初始化数据文件中的静态常量成员
- 用成员函数初始化数据成员
- 如何用该类的其他成员数据初始化类成员数据
- 尝试在构造函数中初始化数据成员,但失败.为什么
- 在c++中使用初始化列表初始化数据成员引用