我是编程新手,我正在尝试查看这本C ++高级版书籍,但是在检查LAMBDA部分时,我在VBS 2013上遇到编译错误
// use captured variables
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
const long Size = 390000L;
int main()
{
using std::cout;
std::vector<int> numbers(Size);
std::srand(std::time(0));
std::generate(numbers.begin(), numbers.end(), std::rand);
cout << "Sample size = " << Size << '\n';
// using lambdas
/*int count3 = std::count_if(numbers.begin(), numbers.end(),
[](int x){return x % 3 == 0; });
cout << "Count of number divisible by 3: " << count3 << '\n';*/
int count13 = 0;
std::count_if(numbers.begin(), numbers.end(),
[&count13](int x){count13 += x % 13 == 0; });
cout << "count of number divisible by 13: " << count13 << '\n';
// using a single lambda
/*int count3 = 0;
int count13 = 0;
std::for_each(numbers.begin(), numbers.end(),
[&](int x){count3 += x % 3 == 0; count13 += x % 13 == 0; });
cout << "Count of number divisible by 3: " << count3 << '\n';
cout << "Count of number divisible by 13: " << count13 << '\n';
*/
return 0;
}
未注释的部分是我得到的部分:'void'类型的条件表达式是非法的。我认为编译器试图将lambda表达式closurert {body}作为条件运算符Exp1读取? Exp2:Exp3;。
此练习的想法是,当使用2+ lambda或1个lambda时,它应该返回相同的值输出,在我的情况下它不会。
欣赏你的启蒙......
答案 0 :(得分:3)
如果未在lambda表达式中使用return语句且未使用尾随返回类型,则lambda评估的返回类型将被视为void
。
而不是
int count13 = 0;
std::count_if(numbers.begin(), numbers.end(),
[&count13](int x){count13 += x % 13 == 0; });
你应该写
int count13 = std::count_if( numbers.begin(), numbers.end(),
[](int x ) { return x % 13 == 0; } );
在这种情况下,lambda的返回类型推导为bool
。
或者,如果您想使用通过引用捕获的变量来计算可被13整除的数字,那么最好使用标准算法std::for_each
例如
int count13 = 0;
std::for_each( numbers.begin(), numbers.end(),
[&count13]( int x ) { count13 += x % 13 == 0; } );
在这种情况下,它等同于基于声明的范围
int count13 = 0;
for ( int x : numbers ) count13 += x % 13 == 0;