MaP*_*aPo 2 c++ lambda constructor member-initialization
我可以毫无问题地编译以下代码(使用 gcc 11.1.0):
\n#include <iostream>\n\ntemplate <typename Func>\nclass K {\n Func f;\npublic:\n K(Func _f): f{_f} {};\n void do_thing(int x) {f(x);};\n};\n\nint main()\n{\n auto f = [](int x) {std::cout << x << std::endl;};\n K kl{f};\n kl.do_thing(5);\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n但是我想在类的构造函数中执行一些检查K(例如某些函数std::is_convertible_v内部的一些bool检查),所以我尝试将代码修改为
#include <iostream>\n\ntemplate <typename Func>\nclass K {\n Func f;\n \npublic:\n K(Func _f) {\n ...\n f = _f;};\n void do_thing(int x) {f(x);};\n};\n\nint main()\n{\n auto f = [](int x) {std::cout << x << std::endl;};\n K kl{f};\n kl.do_thing(5);\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n但这给了我一些错误消息
\nerror: use of deleted function \xe2\x80\x98main()::<lambda(int)>::<lambda>()\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n进而
\nnote: a lambda closure type has a deleted default constructor\nRun Code Online (Sandbox Code Playgroud)\n这让我很困惑,因为我无法理解前一段代码如何能够编译,因为 lambda 函数没有默认构造函数。
\n问题\n如何在构造函数体内设置
我的内容?(这只是一个 MWE,在我的例子中,该类有点复杂,我之前提到的检查是有意义的。)f
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |