【问题标题】:Lambda state behavior differences between an internal static and a captured mutable内部静态和捕获的可变之间的 Lambda 状态行为差异
【发布时间】:2017-02-27 04:09:31
【问题描述】:

我注意到创建一个 lambda 然后进行复制会导致 lambda 中声明的静态变量和值可变变量捕获的不同行为。具体来说,当 lambda 被复制时,可变的状态被复制并变得独立于它被复制的 lambda。但是,lambda 内部的静态值在副本之间共享状态。

#include <iostream>

int main()
{
    int i = 0;
    auto f = [i]() mutable {
        static int h=0;
        std::cout << "mutable captured i by value=" << ++i << "  static h=" << ++h << std::endl;
    };
    f();       // mutable captured i by value=1  static h=1
    i = 10;    // This shows that, as expected, changes in i are ignored by fc
    auto fc = f;
    f();       // mutable captured i by value=2  static h=2
    f();       // mutable captured i by value=3  static h=3
    fc();      // mutable captured i by value=2  static h=4
}

据此,我收集到 lambda 的副本共享相同的执行代码和任何保留状态,而且可变捕获的值不会在同一 lambda 的重复实例之间共享,即使它们在调用之间保留。

这种行为正确吗?我发现 this 关于 lambdas 中的静态,但没有遇到这种状态行为差异。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    static lambda 中的变量的行为与其他地方声明的相同。

    按值捕获的变量表现为 lambda 闭包类型的非静态数据成员。默认情况下,这些成员在 lambda 主体中被视为constmutable 的作用是删除那个const。但在任何情况下,它们都表现为用户定义类中的成员。

    因此,捕获和static 本地人只是不同的东西。后者不受mutable的影响。

    【讨论】:

    • 我几乎总是使用不包含任何状态的 Lambas 作为一种本地声明的函数,但它实际上只是一种像函数一样的类型,具有本地、每个实例、捕获的变量和可能的静态变量在所有类型实例之间共享。完全有道理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2015-10-09
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多