【问题标题】:c++11 lambda capturelist reference [duplicate]c ++ 11 lambda捕获列表参考[重复]
【发布时间】: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 &lt;&lt; i++ &lt;&lt; i++相同的未定义行为
  • @Csq 确实,评估的顺序是未指定的,但这不是未定义的行为。此程序中没有对同一对象的未排序修改。
  • @Casey OP 正在修改e 并在写入(...) i() &lt;&lt; std::endl &lt;&lt; " e:" &lt;&lt; e (...) 时将其打印在同一序列点。为什么它不是未定义的行为?
  • @Csq i() 是一个函数调用:因此,i 中的修改在调用i 之前和之前发生的所有事件之后排序i 返回之后发生的所有事情。表达式 i()e 的求值顺序是未指定的,但不是未排序的。

标签: c++ c++11 lambda cout


【解决方案1】:

&lt;&lt; 操作数的求值顺序未指定;因此未指定第一行中的ed 的值是在调用i() 递增之前还是之后取值。

因此,您可能会在它们递增之前或之后获取值,具体取决于编译器的突发奇想。

第二行在第一行之后排序,所以你肯定会在那里得到递增的值。

【讨论】:

    【解决方案2】:

    未指定函数参数的求值顺序。所以函数参数可以从右到左或从左到右计算。 您的编译器似乎从右到左评估参数。所以在这个声明中

    std::cout << "the value of i():" << i() << std::endl << " e:" << e << " d:"  << d << << std::endl;
    

    编译器首先评估等于 1 的 d,然后评估也等于 1 的 e,然后才评估返回 2 的 i()。所以你得到以下输出

    the value of i():2
    e:1 d:1
    

    请注意,在此语句中使用 operator &lt;&lt; 等效于调用具有相应参数的适当重载运算符函数。

    比如这段代码sn-p

    int a = 10, b = 20;
    
    std::cout << a << ' ' << b;
    

    等价于

    int a = 10, b = 20;
    
    std::operator <<( std::cout.operator <<( a ),  ' ' ).operator <<( b );
    

    要获得预期的结果,您应该将原始语句拆分为

    std::cout << "the value of i():" << i() << std::endl 
    std::cout << " e:" << e << " d:"  << d << << std::endl;
    

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2011-04-15
      • 2014-07-09
      • 1970-01-01
      • 2014-11-07
      • 2018-09-30
      相关资源
      最近更新 更多