为什么Lambda返回布尔

Why lambda returns bool?

本文关键字:布尔 返回 Lambda 为什么      更新时间:2023-10-16

我已经开始学习C 11和C 14,我有一个问题。为什么lambda不返回23?

template<class T>
auto func(T t)
{
    return t;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    auto abc = []()->auto { return func(23); };
    qDebug() << abc; // output: true
    return a.exec();
}

@bathsheba指出。您有错字,不要打电话给lambda。现在,很明显,对于qDebug()而言,operator<<没有在Lambda的闭合类型上超载。因此,自然必须发生隐性转换顺序。唯一可用的,仅是因为您的lambda是捕获的,从转换为函数指针开始。

现在,可以使用哪种过载operator<<来打印功能指针?从表面上看,两个可能的候选人:

operator<<(bool t)         // Because it prints true, duh
operator<<(const void *p)  // Because pointers :)

为什么bool超载?因为功能指针不能隐式转换为void*。该转换是有条件地支持的,必须使用铸件([Expr.Reinterpret.cast]/8)执行:

将功能指针转换为对象指针类型,反之亦然 是有条件支撑的。

只有[Cons.Bool]离开我们:

算术,未列出,指针或指针 会员类型可以转换为bool类型的prvalue。

您需要实际执行 lambda:

qDebug() << abc();

当前<<过载是将lambda的类型转换为 bool,然后输出。