C++ 如何在不复制的情况下保持右值引用传递的对象处于活动状态?
我试图将C++ 如何在不复制的情况下保持右值引用传递的对象处于活动状态?,c++,c++11,pass-by-reference,rvalue-reference,C++,C++11,Pass By Reference,Rvalue Reference,我试图将子项作为r值传递给父项,并将其保存在那里,而无需复制子项 Parent p{ Child{} }; cout << "----Done----" << endl; 给出了完全相同的结果。您引用的标准的一部分引用了如下内容: struct A { }; int main() { const A &a = A{}; ... } 现在,a将在功能范围main结束后被销毁。这对班级成员不起作用。通过引用将值传递给函数(毕竟构造函数只是一个函数)不会延
子项
作为r值传递给父项
,并将其保存在那里,而无需复制子项
Parent p{ Child{} };
cout << "----Done----" << endl;
给出了完全相同的结果。您引用的标准的一部分引用了如下内容:
struct A { };
int main() {
const A &a = A{};
...
}
现在,
a
将在功能范围main
结束后被销毁。这对班级成员不起作用。通过引用将值传递给函数(毕竟构造函数只是一个函数)不会延长引用的生存期。也不会将其分配给成员变量。您引用的标准的一部分涉及如下内容:
struct A { };
int main() {
const A &a = A{};
...
}
现在,a
将在功能范围main
结束后被销毁。这对班级成员不起作用。通过引用将值传递给函数(毕竟构造函数只是一个函数)不会延长引用的生存期。也不会将其分配给成员变量
说明:r值引用可用于延长临时对象的生存期
你漏掉了那句话的一个重要部分。更准确的一句话是:“右值引用可用于定义临时对象的类型”
注意到区别了吗?(如果你不这样做,不要太担心,因为这很微妙。)这里有一个链接,可以解释如何以及何时延长临时工的寿命。您已将此问题标记为C++11,因此在C++14应用之前有效的要点是:
- 与构造函数初始值设定项列表中引用成员的临时绑定仅在构造函数退出之前持续存在,而不是只要对象存在。(注意:截至1696年DR,此类初始化的格式不正确)
如何延长寿命?这很棘手,但如果参数始终是临时的,则可以将您的成员设置为非引用,并将参数移动到成员。如果您想要更多的灵活性,您可能需要接受一些复制 说明:
r值引用可用于延长临时对象的生存期
你漏掉了那句话的一个重要部分。更准确的一句话是:“右值引用可用于定义临时对象的类型”
注意到区别了吗?(如果你不这样做,不要太担心,因为这很微妙。)这里有一个链接,可以解释如何以及何时延长临时工的寿命。您已将此问题标记为C++11,因此在C++14应用之前有效的要点是:
- 与构造函数初始值设定项列表中引用成员的临时绑定仅在构造函数退出之前持续存在,而不是只要对象存在。(注意:截至1696年DR,此类初始化的格式不正确)
如何延长寿命?这很棘手,但如果参数始终是临时的,则可以将您的成员设置为非引用,并将参数移动到成员。如果您想要更大的灵活性,您可能需要接受一些拷贝。“无拷贝”这到底是什么意思?只给
Parent
一个Child
值来移动构造有什么不对?引用引用对象;它不拥有它。为什么要使用引用像这样管理所有权?我的意思是不复制子对象。Cppreference说rvalue ref可以用来延长对象的生存期。假设子对象是一个字符串。我如何使用它初始化父项并保留它以备以后使用,而不必再次复制并销毁它?您能否提供一个指向您引用的cppref页面的链接?我很确定它没有确切地说明您所阅读的内容,但我需要一些时间才能再次找到该页面。右值引用的生命扩展不适用于类成员,而仅适用于局部变量。您只需声明Child
和doParent(Child&&c):Child(c)
它调用Child的move构造函数,不会导致重复/复制您的输出和问题表明您将“复制”与“构造”混淆。对象可以在移动语义的上下文中构造(通过移动构造函数),但仍然不能被“复制”。这就是移动语义的要点。复制(计算或资源方面)成本高昂的东西可以移动,从而避免这种开销。“勇气”将所有权从一个物体转移到另一个物体,使源头只剩下它以前的外壳。“没有任何副本”你这到底是什么意思?只给Parent
一个Child
值来移动构造有什么不对?引用引用对象;它不拥有它。为什么要使用引用像这样管理所有权?我的意思是不复制子对象。Cppreference说rvalue ref可以用来延长对象的生存期。假设子对象是一个字符串。我如何使用它初始化父项并保留它以备以后使用,而不必再次复制并销毁它?您能否提供一个指向您引用的cppref页面的链接?我很确定它没有确切地说明您所阅读的内容,但我需要一些时间才能再次找到该页面。右值引用的生命扩展不适用于类成员,而仅适用于局部变量。您只需声明Child
和doParent(Child&&c):Child(c)
它调用Child的移动构造函数,不会导致重复/复制您的输出和问题表明您将“复制”与“构造”混淆
struct A { };
int main() {
const A &a = A{};
...
}