C++延长 && 的使用寿命
C++ extending lifetime of &&
在下面的示例中:
http://coliru.stacked-crooked.com/a/7a1df22bb73f6030
struct D{
int i;
auto test2(int&& j){
return [&](){ // captured by reference!
cout << i*(j);
};
}
};
int main()
{
D d{10};
{
auto fn = d.test2(10);
fn(); // 1. wrong result here
d.test2(10)(); // 2. but ok here
}
}
为什么d.test2(10)();
有效?
它真的应该有效,还是这只是我的未定义行为等于正确的结果?
附言读完这篇文章后,我只看到一种解释:在 (2) 中,临时生存期延长到表达式结束,调用发生在与 && crteation 相同的表达式中;而 (1) 实际上由 2 个表达式组成:
存在与函数调用中的引用参数的临时绑定 直到包含该函数调用的完整表达式结束:if 该函数返回一个引用,该引用的寿命超过完整表达式, 它变成了一个悬而未决的参考。
是这样吗?
一个临时对象会持续到创建它的行尾(嗯,完整的表达式),除非生存期延长。
您的代码不会延长任何临时对象的生存期。 通过绑定到引用来延长生存期不会"交换",只有第一个绑定会延长生存期。
所以最糟糕的情况是UB,因为你有一个悬而未决的参考。 所引用的临时消失在行尾:在下一行 uou 跟随引用,混乱发生。
在第二种情况下,您的引用不会延长临时的生存期,但临时引用的持续时间比绑定到它的引用持续时间更长! 他们都死在生产线的尽头,按构造的相反顺序。
所以调用有效。
它真的应该有效,还是这只是我的未定义行为等于正确的结果?
好像是这样。在您链接的示例中,您有以下警告:
warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized]
未初始化的对象具有不确定的值,尝试访问这些值会导致未定义的行为。
相关文章:
- 在不复制临时对象的情况下延长其生存期
- 寿命延长从函数返回引用
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- 对临时对象的Const引用不会延长其生存期
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 有什么方法可以延长C++中临时对象的生存期吗
- 返回引用是否也会延长其生存期?
- 以延长构造函数外部 QT 对象的生存期
- 在现代C++中,临时寿命延长何时有用?
- C++ - 使用常量引用来延长临时成员,确定还是 UB?
- I/O 操纵器错误或临时延长寿命由 const 参考?
- 延长函数的寿命延长 由 const& 获取参数并由 const& 返回
- 如果常量引用延长了此右值的寿命,则此右值驻留在何处?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 延长变量的生存期
- 为什么 C++ 从推断的返回类型中去除引用限定符,为什么生存期延长不起作用?
- 使用常量引用延长临时对象的寿命
- 我可以在接受服务器上延长TCP握手持续时间吗?