如何使对象通过RVALUE参考通过而没有复制
How to keep object passed by rvalue reference alive without copy?
我试图将 Child
作为r-value传递给 Parent
并保存在那里而无需复制 Child
。
Parent p{ Child{} };
cout << "----Done----" << endl;
现在实现:
class Child
{
public:
Child() { cout << "Child: created" << endl; }
~Child() { cout << "Child: destroyed" << endl; }
};
class Parent
{
// store as r-value ref
Child&& child;
public:
// pass by r-value ref and move
Parent(Child&& c) :child(move(c))
{
cout << "Parent: created" << endl;
}
~Parent() { cout << "Parent: destroyed" << endl; }
};
输出为:
儿童:创建
父:创建
儿童:被摧毁
------完成-------
父母:被摧毁
cppref说: Rvalue references can be used to extend the lifetimes of temporary objects
问题1:为什么Child
在末尾没有销毁(或至少在完成完成之后(?
问题2:如何使其寿命更长?
P.S:
Child& child;
...
Parent(Child c) :child(c)
给出完全相同的结果。
cppref说:
Rvalue references can be used to extend the lifetimes of temporary objects
您忽略了该报价的重要组成部分。一个更准确的报价是:" RVALUE参考可以用于延长临时对象的寿命" 。
注意区别?(如果不这样做,请不要担心太多。(有一个链接指向有关如何以及何时可以延长临时寿命的链接。您已经标记了此问题C 11,因此有效的子弹点直到适用C 14:
- 在构造函数初始化器列表中,临时绑定到参考构件,仅在构造函数退出之前一直存在,直到对象存在为止。(注意:这种初始化是从1696年DR造成的(。
您将临时性绑定到构造函数初始化器列表中的参考成员。临时的寿命不会超出构造函数的尽头。在称为对象的破坏者之前,临时性被摧毁。
如何使其寿命更长?这变得很棘手,但是如果参数始终是暂时的,则可以使您的成员成为非参考,而move
参数为成员。如果您想要更灵活的性能,则可能需要接受一些复制。
您引用的标准的一部分是指这样的东西:
struct A { };
int main() {
const A &a = A{};
...
}
,一旦功能范围main
结束,现在a
将被销毁。这对班级成员不起作用。通过参考将值传递给函数(毕竟所有构造函数只是一个函数(并不是参考的寿命。也不将其分配给成员变量。
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 如何使对象通过RVALUE参考通过而没有复制
- C :通过STD :: simolor_ptr(仅移动类型)rvalue作为参数时复制ELISION
- 如果lvalue,请参考,如果rvalue进行复制,即使rvalue持久
- RValue,模板解析和复制构造函数(Visual c++ 2010)