gpt4 book ai didi

c++ - 使 lambda 不可复制/不可移动

转载 作者:行者123 更新时间:2023-12-01 19:42:14 28 4
gpt4 key购买 nike

考虑以下code :

#include <iostream>
#include <thread>

int main() {
std::thread t;
const auto l = [x = std::move(t)]{};
decltype(l) m = std::move(l);
}

此代码无法编译并显示以下消息:

prog.cc: In function 'int main()':
prog.cc:7:32: error: use of deleted function 'main()::<lambda()>::<lambda>(const main()::<lambda()>&)'
7 | decltype(l) m = std::move(l);
| ^
prog.cc:6:37: note: 'main()::<lambda()>::<lambda>(const main()::<lambda()>&)' is implicitly deleted because the default definition would be ill-formed:
6 | const auto l = [x = std::move(t)]{};
| ^
prog.cc:6:37: error: use of deleted function 'std::thread::thread(const std::thread&)'
In file included from prog.cc:2:
/opt/wandbox/gcc-head/include/c++/10.0.1/thread:154:5: note: declared here
154 | thread(const thread&) = delete;
| ^~~~~~

有没有一种方法可以使 lambda 不可复制或不可移动,而无需显式捕获任何不可复制的变量(即将 [] 留空)?

最佳答案

您可以编写一个简单的包络聚合来防止移动和复制。

struct NoCopyMove {
NoCopyMove(NoCopyMove const&) = delete;
NoCopyMove(NoCopyMove&&) = delete;

void operator=(NoCopyMove const&) = delete;
void operator=(NoCopyMove&&) = delete;
};

template<class Functor>
struct Fixed : Functor, NoCopyMove {
using Functor::operator();
};

template<typename F>
Fixed (F&&) -> Fixed<std::decay_t<F>>;

像这样使用

const auto l = Fixed{[]{}};

NoCopyMove 是一个简单的 mixin,可以禁用复制和移动。通过这种方式编写,我们可以将 Fixed 的特化保持为简单的聚合。

所有Fixed所做的就是将作为参数给出的仿函数继承/初始化为基类(尽可能保证复制省略)。然后公开其operator()

由于没有涉及任何成员(除了 Functor 中的成员),并且由于 lambda 不可能从我们的自定义 NoCopyMove 类继承,因此空基优化将启动对于无状态 lambda。因此,对象不会比初始化它们所用的 lambda 更大。

关于c++ - 使 lambda 不可复制/不可移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60315896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com