使用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
相关产品推荐
相关产品推荐

