【发布时间】:2014-06-06 10:40:57
【问题描述】:
下面是我关于c++11 lambda的练习代码:
#include<iostream>
int d = 0;
int main()
{
int e = 1;
auto i = [&]() ->int {
e += 1;
d += 1;
return d;};
d += 1;
std::cout << "the value of d:" << d << std::endl;
std::cout << "the value of i():" << i() << std::endl << " e:" << e << " d:" << d << std::endl;
std::cout << " e:" << e << " d:" << d << std::endl;
return 0;
}
我得到的结果并不像预期的那样:
the value of d:1
the value of i():2
e:1 d:1
e:2 d:2
我就是不明白为什么
std::cout << "the value of i():" << i() << std::endl << " e:" << e << " d:" << d << std::endl;
std::cout << " e:" << e << " d:" << d << std::endl;
这两行给出了不同的 e 和 d 输出?
ps:原谅我的英语不好
【问题讨论】:
-
这是与
std::cout << i++ << i++相同的未定义行为 -
@Csq 确实,评估的顺序是未指定的,但这不是未定义的行为。此程序中没有对同一对象的未排序修改。
-
@Casey OP 正在修改
e并在写入(...) i() << std::endl << " e:" << e (...)时将其打印在同一序列点。为什么它不是未定义的行为? -
@Csq
i()是一个函数调用:因此,i中的修改在调用i之前和之前发生的所有事件之后排序 在i返回之后发生的所有事情。表达式i()和e的求值顺序是未指定的,但不是未排序的。