【问题标题】:C++ lambda conversion -- why is candidate constructor not viable: no known conversion from lambda to std::functionC++ lambda 转换——为什么候选构造函数不可行:没有已知的从 lambda 到 std::function 的转换
【发布时间】: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。

标签: c++ lambda


【解决方案1】:

你的问题是只允许一个用户转换,你需要两个:

  • lamba -> std::function -> A.

两者

A a{[](std::string) {}};
MyFunc({[](std::string) {}});

工作。

【讨论】:

  • 啊,好吧,我怀疑这一点。有没有办法在 A 类中指定 lambda 转换? A(lambda x) { ... } 什么的?
  • template &lt;typename T, std::enable_if_t&lt;!std::is_same&lt;A, std::decay_t&lt;T&gt;&gt;::value, int&gt; = 0&gt; A(T&amp;&amp;) 可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多