lambda表达式Bug——修改捕获变量失败
解《C++ Primer 5th》的 9-50 练习题时,遇到了 lambda表达式值捕获和引用捕获之区别问题。
欲修改捕获的变量 sum,累加之。但当时忘记值捕获和引用捕获是有区别的。下面的代码使用值捕获,未能修改 sum变量的值:
int main(){ vector<string> v; string s; int sum = 0; while (cin >> s) v.push_back(s); for_each(v.cbegin(), v.cend(), [sum](const string &s) mutable { sum += stoi(s); }); cout << sum; // 输出 0 }
正确的方式:
修改 lambda的捕获列表,使 sum表达为 &sum。修改后正确的代码如下:
int main() { vector<string> v; string s; int sum = 0; while (cin >> s) v.push_back(s); for_each(v.cbegin(), v.cend(), [&sum](const string &s) mutable { sum += stoi(s); }); cout << sum; // 输出 1 - 10 的累加和 42 return 0; }
(全文完)
智慧在街市上呼喊,在宽阔处发声。