C ++ lambda作为函数的模板参数不起作用

Posted

技术标签:

【中文标题】C ++ lambda作为函数的模板参数不起作用【英文标题】:C++ lambda as templated parameter of a function not working 【发布时间】:2018-12-05 18:05:49 【问题描述】:

我正在尝试将 lambda 传递给 maybe() 函数中的参数,但它的工作很奇怪。代码如下:

template<typename R, typename F>
void maybe(R& result, F& lambda) 
    if (0 == result)   
        result = lambda();
    


auto l = [&]() 
    return adi_uart_Open(deviceNum, ADI_UART_DIR_BIDIRECTION, &memory, ADI_UART_BIDIR_DMA_MEMORY_SIZE, &handle);
;

如果我打电话

maybe(result, l);

然后一切正常。但是,如果我将lamba直接放入函数中,例如:

maybe(result, [&]()return adi_uart_Open(deviceNum, ADI_UART_DIR_BIDIRECTION, &memory, ADI_UART_BIDIR_DMA_MEMORY_SIZE, &handle););

然后我收到以下错误:

错误:没有函数模板的实例“可能”与参数列表匹配

我会使用 std::function 而不是模板,但它在我正在使用的嵌入式设备上不可用。

【问题讨论】:

F&amp; 是非const 左值引用,它不能绑定到您的临时 lambda。使用F const &amp;F&amp;&amp; 复制:***.com/q/1565600/5470596 ? 【参考方案1】:

maybe 采用左值引用:

maybe(R& result, F& lambda)

C++ 禁止将非常量左值引用绑定到临时值。添加一个常量。

maybe(R& result, F const& lambda)

【讨论】:

以上是关于C ++ lambda作为函数的模板参数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 lambda 作为模板参数传递给函数指针函数模板化

lambda函数在多进程中不起作用

模板函数与带有自动参数的命名 lambda

Lambda 作为函数参数

C++20:非类型模板参数中的非捕获 lambda

带有 lambda 作为每个实例化的唯一默认参数的模板