【发布时间】:2018-08-11 00:57:31
【问题描述】:
关于隐式 lambda 转换的问题。我有这种类型:
class A {
public:
A(std::function<void(std::string)> func) {
....
}
};
我相信它有一个有效的复制构造函数。
因为我想做以下事情
A a = [](std::string param) { ... };
或者
void MyFunc(A a) { ... } // definition
MyFunc([](std::string param) { ... }); // call
然而这两个都会产生编译错误:
注意:候选构造函数不可行:第一个参数没有从 '(lambda at ....)' 到 'std::function' 的已知转换
这是为什么?或者这应该是可能的吗?
【问题讨论】:
-
虚拟化一些简单的代码并用 gcc 8.1.1 进行尝试表明使用统一初始化语法构造对象可以正常工作。我不会费心写一个答案,因为您的真实代码很可能与这些孤立的代码 sn-ps 不相似,它们只是模糊地类似于 C++ 代码,因此您的真正问题可能在其他地方。您需要获取stackoverflow.com 的tour,转到help center,阅读创建minimal reproducible example 的说明,然后阅读上面的edit 您的问题,提供一个独立的minimal reproducible example,它演示了你的编译错误。
-
Docs claim it should work for
lambdas(已添加重点):“std::function的实例可以存储、复制和调用任何可调用目标——函数、lambda 表达式、绑定表达式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针。”它包含一个直接存储lambda的示例,因此它应该可以正常工作。 -
@SamVarshavchik:提供的代码显示了该问题。但错误信息不明确,误导OP。