LAMBDA错误:'void'类型的条件表达式是非法的

时间:2014-12-23 13:09:19

标签: c++ lambda

我是编程新手,我正在尝试查看这本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时,它应该返回相同的值输出,在我的情况下它不会。

欣赏你的启蒙......

1 个答案:

答案 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;