不能从lambda构建

Cannot construct from lambda

本文关键字:构建 lambda 不能      更新时间:2023-10-16

我遇到了一个汇编问题。我不明白为什么以下代码不编译:

#include <functional>
namespace async {
template<class ...T>
using Callback = std::function<void(const std::string& result, T ...args)>;
template<class Signature>
class Function;
template<class Res, class ...Args>
class Function<Res(Args...)>
{
    std::function<void(Args ...args, const Callback<Res>&)> m_function;
public:
    Function(std::function<void(Args ...args, const Callback<Res>&)>&& function) : m_function(std::move(function)) {}
    Function& operator=(std::function<void(Args ...args, const Callback<Res>&)>&& function) {m_function = std::move(function); return *this;}
    void operator()(Args... args, const Callback<Res>& callback) const {m_function(args..., callback);}
};
}
async::Function<int(int)> getF()
{
    return [](int i, const async::Callback<int> callback)
    {
        callback("", i);
    };
}
int main(int argc, char** argv)
{
    auto f0 = getF();
    return 0;
}

GCC说:

在函数" async :: function getf(("中 错误:无法将'getf((:: __ lambda0 {}'从'getf((:: __ lambda0''转换为'async :: function'

ICC说:

错误:没有合适的用户定义的转换来自" lambda [](int,async :: callback( -> void to" async :: function"

现在,如果我替换

    return [](int i, const async::Callback<int> callback)
    {
        callback("", i);
    };

    return async::Function<int(int)>([](int i, const async::Callback<int> callback)
    {
        callback("", i);
    });

然后起作用。为什么我需要明确施放以及如何避免这种情况?


一个简单的解决方案是将类功能替换为

之类的东西
template<class Signature>
using Function = std::nullptr_t;
template<class Res, class ...Args>
using Function<Res(Args...)> = std::function<void(Args ...args, const Callback<Res>&)>;

但是使用<Res(Args...)>的专业不编译...

没有Function构造函数接受lambda。有一个接受std::function,还有一个std::function构造函数接受lambda,但是C 永远不会为您组合两个隐式用户定义的转换。

定义所需构造函数的最简单方法是

template <class T>
Function (T&& t) : m_function(std::forward<T>(t)) {}