【问题标题】:C++ lambda as templated parameter of a function not workingC ++ lambda作为函数的模板参数不起作用
【发布时间】:2023-10-19 10:50:01
【问题描述】:

我正在尝试将 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;

标签: c++ c++11 lambda


【解决方案1】:

maybe 采用左值引用:

maybe(R& result, F& lambda)

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

maybe(R& result, F const& lambda)

【讨论】: