Skip to content

lambda - 闭包捕获变量的生命周期问题 存在笔误 #73

@Moujuruo

Description

@Moujuruo

闭包捕获变量的生命周期问题

正因如此,闭包按值捕获([=])的变量,其生命周期和 Lambda 对象相同。

当 Lambda 对象被拷贝时,其按值捕获的所有变量也会被重新拷贝一份。

当 Lambda 对象被移动时,其按值捕获的所有变量也会随之一起移动。

struct C {
    C() { fmt::println("C 默认构造"); }
    C(C const &) { fmt::println("C 拷贝构造"); }
    C(C &&) { fmt::println("C 移动构造"); }
    C &operator=(C const &) { fmt::println("C 拷贝赋值"); }
    C &operator=(C &&) { fmt::println("C 移动赋值"); }
    ~C() { fmt::println("C 析构"); }
};

C c;
fmt::println("构造 lambda");
auto lambda = [c] {};
fmt::println("拷贝 lambda 到 lambda2");
auto lambda2 = lambda;
fmt::println("移动 lambda 到 lambda3");
auto lambda3 = lambda;

输出:

C 默认构造
构造 lambda
C 拷贝构造
拷贝 lambda 到 lambda2
C 拷贝构造
移动 lambda 到 lambda3
C 移动构造
C 析构
C 析构
C 析构
C 析构

问题

如果按照代码,第7行输出应为"C 拷贝构造"。
按照输出,代码最后一行应为auto lambda3 = std::move(lambda);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions