定义 UnaryPredicate 时类型为 void 的非法操作数

Illegal operand of type void when defining UnaryPredicate

我正在尝试将 std::partition 与自定义 UnaryPredicate 一起使用。

void Rank(vector< pair<double, string> >& pairs) const
{
    partition(pairs.begin(), pairs.end(), [](const pair<double, string>& a) { isnan(a.first); });
}

执行此操作时,我收到来自 Visual Studio 2015 的以下错误:

然而以下没有问题:

bool pairIsNan(const pair<double, string>& a)
{
    return isnan(a.first);
}
partition(pairs.begin(), pairs.end(), pairIsNan);

谁能说明第一组代码有什么问题以及如何解决?

你的 lambda 没有 return 任何东西,它对应的函数实际上是这样的:

void pairIsNan(const pair<double, string>& a)
{
    // Discard the result of the isnan function
    (void) isnan(a.first);
}

要使其工作,您需要 return lambda 中 isnan 函数调用的结果:

partition(pairs.begin(), pairs.end(), [](const pair<double, string>& a)
{
    // Return the result
    return isnan(a.first);
});