【发布时间】:2016-05-29 21:23:53
【问题描述】:
在以下示例中:
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)(); 有效?
它真的应该起作用吗,或者那只是我未定义的行为等于正确的结果?
P.S. 阅读this 后,我只看到一种解释:在(2)中,临时生命周期延长到表达式结束,并且调用发生在与 && crteation; 相同的表达式中;而 (1) 实际上由 2 个表达式组成:
在函数调用中存在临时绑定到引用参数 直到包含该函数调用的完整表达式的结尾: if 该函数返回一个引用,该引用比完整表达式的寿命长, 它变成了一个悬空引用。
是这样吗?
【问题讨论】:
-
是的,您找到并输入问题的答案是正确答案。
-
@hvd - 你确定吗?我实际上找不到“表达”的定义。
-
是的,非常确定。 “表达式”是语法中的产生式。 “全表达式”在[intro.execution]p10中定义,基本意思是“不是子表达式的表达式”,意思是
d.test2(10)();语句中唯一的全表达式是d.test2(10)()。 -
@hwd - 所以...“表达式”可以被“;”识别还是序列点?我的意思是我可以用
d.test2(10)();之类的行来意外地将表达式分成两个(因此得到悬空引用)吗? -
@AnT 是的 - 你是对的,
const int&我得到了同样的行为
标签: c++ c++11 rvalue-reference temporary