- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以毫无问题地编译以下代码(使用 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/
因此,我的flutter应用程序运行正常,但是我想对其进行一些更改。 我要执行的第一个更改是创建一个水平滚动窗口小部件,该窗口小部件的图像可以单击以更改工作站。 但是要做到这一点,我首先需要将两个小部
如何在 Bootstrap 模态的主体内设置 div 样式?这是我的模型: text ') .okBtn('ok') .open();">Open Model 我的CSS: @M
我有一个简单的触发器,它在 SQL Fiddle 上运行,但它不允许我将 INSERT STATEMENT 移动到触发器的主体内。 my code on sqlFiddle我只是想移动这条线 INSE
我是一名优秀的程序员,十分优秀!