Lambda 因子可复制或可移动

Lambda factor copyable or moveable

提问人:John 提问时间:3/31/2022 最后编辑:Jarod42John 更新时间:3/31/2022 访问量:109

问:

lambda 只是一个无名类的实例。如果它没有捕获任何内容,它甚至不会有任何成员变量。

我认为特定的 lambda 是可复制的还是可移动的取决于实际捕获的对象(和变量)是可复制的还是可移动的。

此外,如果特定 lambda 捕获所有对象(或将它们称为变量)作为参考,则此 lambda 因子必须是可移动和可复制的。

但是这个代码片段让我完全困惑(请注意代码片段中的注释):


#include <mutex>
#include <map>
#include <iostream>

constexpr int FOO_NUM = 5;

int main()
{
    std::mutex mt_lk;
    
    auto factor1 =[&mt_lk](){{
        std::lock_guard<std::mutex> lk(mt_lk);
        std::cout << "hello world, first" << std::endl;
    }};
    
    auto factor2 = factor1;
    
    auto factor3 = std::move(factor1); //I think the mt_lk is already moved here.
    
    factor2();
    factor3();
    
    std::lock_guard<std::mutex> lk(mt_lk); //I think mt_lk could not be called here. But no problem is found now.
    std::cout << "hello world, second" << std::endl;
}
C++ C++11 lambda 复制构造函数 move-constructor

评论

0赞 John 3/31/2022
@273K 你能为我更详细地解释一下吗?
0赞 273K 3/31/2022
std::mutex既不可移动也不可复制,都得到引用。factor*mt_lk
0赞 John 3/31/2022
@273K 如果我理解正确,请移动引用对象本身以外的引用(即)。我说得对吗?std::move(factor1)mt_lkml_lk
0赞 super 3/31/2022
@273K 只有对 的引用。所以它在这里既是可移动的,也是可复制的。但在这种情况下,他们会给出相同的结果。就像复制和移动是一回事一样。factor*mt_lkint

答: 暂无答案