gpt4 book ai didi

c++ - 在类构造函数体内初始化 lambda 函数

转载 作者:行者123 更新时间:2023-12-01 23:15:00 28 4
gpt4 key购买 nike

我可以毫无问题地编译以下代码(使用 gcc 11.1.0):

#include <iostream>

template <typename Func>
class K {
Func f;
public:
K(Func _f): f{_f} {};
void do_thing(int x) {f(x);};
};

int main()
{
auto f = [](int x) {std::cout << x << std::endl;};
K kl{f};
kl.do_thing(5);

return 0;
}

但是我想在类 K 的构造函数中执行一些检查(例如某些 bool 内的一些 std::is_convertible_v函数),所以我尝试将代码修改为

#include <iostream>

template <typename Func>
class K {
Func f;

public:
K(Func _f) {
...
f = _f;};
void do_thing(int x) {f(x);};
};

int main()
{
auto f = [](int x) {std::cout << x << std::endl;};
K kl{f};
kl.do_thing(5);

return 0;
}

然而这给了我一些错误消息

error: use of deleted function ‘main()::<lambda(int)>::<lambda>()’

然后

note: a lambda closure type has a deleted default constructor

这让我很困惑,因为我无法理解前一段代码如何能够编译,因为 lambda 函数没有默认构造函数。

问题
如何在构造函数的主体内设置我的 f ? (这只是一个 MWE,在我的例子中,该类有点复杂,我之前提到的检查是有意义的。)

最佳答案

How can I initialize my f inside the body of the constructor?

你不能。 f = _f; 构造函数体内是赋值,而不是初始化。所以f会先默认初始化,然后进入构造函数体(进行赋值)。

您可以使用std::function来代替;它可以是默认初始化的,然后您可以在构造函数主体中分配它。


顺便说一句:从 C++20 开始,您的代码将可以正常编译,即使它可能无法按您的预期工作(取决于 ... 部分)。对于 lambdas ,

If no captures are specified, the closure type has a defaulted default constructor. Otherwise, it has no default constructor (this includes the case when there is a capture-default, even if it does not actually capture anything).

关于c++ - 在类构造函数体内初始化 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69101649/

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