#include <iostream>
#include <functional>


int main() {
    std::vector<int> integers = {0, 1, 2};

    std::function<void()> lambda = [integers] {
        printf("vector size (in lambda function): %zu\n", integers.size());
    };

    printf("vector size (in main()): %zu\n", integers.size());

    lambda();

    return 0;
}

在这个简单的程序中,vectorintegers通过复制的方式被送入一个 lambda 函数中,因此在这个 lambda 函数创建之后它就不会改变。

现在,如何在将向量发送到此 lambda 函数的同一时刻销毁/清除它?就像将向量发送到函数时一样std::move()

我目前最接近的解决方案是实现上述目标:

std::vector<int> integers = {0, 1, 2};

std::function<void()> lambda = [integers] {
    printf("vector size (in lambda function): %zu\n", integers.size());
};
integers.clear();

printf("vector size (in main()): %zu\n", integers.size());

lambda();

但即便如此,在创建 lambda 函数之后,向量仍然会被清除。

那么,如何在 lambda 函数创建时销毁这个向量呢?

9

  • 1
    为什么要破坏原始向量?


    – 

  • 3
    将其作为参数传递而不是捕获它?


    – 


  • 1
    另一方面,除非您需要将函数存储在其他地方(例如作为类中的回调),否则就不需要std::function。在这种情况下,只需使用auto类型推断。


    – 

  • 8
    你会笑的,但是[integers=std::move(integers)]


    – 

  • 3
    您需要解决的实际和潜在问题是什么?为什么您认为在创建 lambda 时“销毁”向量会解决该问题?这很大程度上是一个


    – 


最佳答案
1

尽管 C++11 仅允许在 lambda 捕获中使用引用或复制值,但 C++14 引入了。您可以在其中一个表达式中移动向量。

#include <cstdio>
#include <functional>
#include <utility>    

int main() {
    std::vector<int> integers = {0, 1, 2};

    std::function<void()> lambda = [integers=std::move(integers)] {
                       // Initializing move ^^^^^^^^^^^^^^^^^^^^
       std::printf("vector size (in lambda function): %zu\n", integers.size());
    };

    std::printf("vector size (in main()): %zu\n", integers.size());

    lambda();

    return 0;
}

向量大小(在 main() 中):0
向量大小(在 lambda 函数中):3