c – 通过rvalue数据成员扩展临时生命周期,而不是使用构造函数,
我找到了以下方案来延长临时终身作品,我不知道是否应该,但它是.
struct S { std::vector<int>&& vec; }; int main() { S s1{std::vector<int>(5)}; // construct with temporary std::cout << s1.vec[0] << 'n'; // fine,temporary is alive } 但是,当S被赋予一个显式的值构造函数时,它不再是一个聚合,并且该方案在s1.vec [0]上无效读取失败, struct S { std::vector<int>&& vec; S(std::vector<int>&& v) : vec{std::move(v)} // bind to the temporary provided { } }; int main() { S s1{std::vector<int>(5)}; // construct with temporary std::cout << s1.vec[0] << 'n'; // not ok. invalid read on free'd memory } 为什么这是有效的聚合?我认为它与构造函数是一个实际的函数调用有关,基于我用const lvalue引用的红色.另外,有什么办法可以使后一种情况发挥作用吗? 在SO上使用lvalue引用的类似情况有很多问题.我看到,如果我使用了一个const lvalue参考,它不会有助于延长临时的生命周期,rvalue引用的规则是否相同? 解决方法
TL; DR
可以使用聚合初始化来延长临时性的使用寿命,因为用户定义的构造函数实际上是一个函数调用,所以不能这样做. 注意:T const&和T&&适用于总体生命力的情况,延长对他们的临时生活. 什么是聚合? struct S { // (1) std::vector<int>&& vec; }; 为了回答这个问题,我们必须深入了解一个聚合的初始化和一个类类型的初始化之间的区别,但首先我们必须确定一个聚合是什么:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |