You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用void函数时为何出现C++左值&右值错误?如何解决?

C++ lambda绑定非const左值引用的编译错误解决

你的代码如下:

#include <iostream>
#include <array>
#include <algorithm>

const int Size = 5;

template <typename T>
void sum(std::array<double, Size> a, T& fp);

int main()
{
    double total = 0.0;

    std::array<double, Size> temp_c = {32.1, 34.3, 37.8, 35.2, 34.7};
    sum(temp_c, [&total](double w){ total += w; });
    std::cout << "total: " << total << std::endl;
    std::cin.get();
    return 0;
}

template <typename T>
void sum(std::array<double, Size> a, T& fp)
{
    for (auto pt = a.begin(); pt != a.end(); ++pt)
        fp(*pt);
}

错误原因解释

编译错误cannot bind non-const lvalue reference of type '...<lambda(double)>&' to an rvalue of type '...<lambda(double)>'的核心逻辑:

  • 你直接传递给sum的lambda表达式是一个临时右值对象,它没有持久的内存身份,用完就会销毁。
  • sum函数的第二个参数是T&(非const左值引用),C++语法禁止将非const左值引用绑定到右值——因为非const左值引用的设计目的是引用一个可修改、有持久存在的左值,临时右值不符合这个要求。

不修改sum()函数的解决方法

将lambda表达式赋值给一个具名变量(具名变量是左值),再把这个变量传递给sum即可:

int main()
{
    double total = 0.0;
    std::array<double, Size> temp_c = {32.1, 34.3, 37.8, 35.2, 34.7};
    
    // 将lambda转为具名左值变量
    auto add_total = [&total](double w){ total += w; };
    sum(temp_c, add_total);
    
    std::cout << "total: " << total << std::endl;
    std::cin.get();
    return 0;
}

补充说明

官方答案出现相同错误的原因是,它的sum函数同样使用了非const左值引用参数。如果允许修改sum函数,也可以将参数改为const T&(const左值引用允许绑定右值)或者T&&(右值引用),但按照你的要求不修改sum的前提下,上述将lambda转为左值的方法是最直接的解决方案。

内容的提问来源于stack exchange,提问作者erpxyr2001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:40:55