【问题标题】:Why lambda returns bool?为什么 lambda 返回 bool?
【发布时间】:2018-05-27 01:27:37
【问题描述】:

我已经开始学习 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();
}

【问题讨论】:

  • 我已重新标记,添加“Qt”,以便专家在输出 lambda 类型时详细说明隐式转换为 bool。

标签: c++ qt c++11 return return-type


【解决方案1】:

您需要真正执行 lambda:

qDebug() << abc();

目前,&lt;&lt; 重载正在将 lambda 的 type 转换为 bool,然后将其输出。

【讨论】:

  • @МишаковМаксим:隐式转换为bool 很有趣:我不使用Qt,所以无法解释更多;如果您逐步浏览库代码,可能会很有趣。
  • 问题在旁边,因为我遇到了这个问题(bool 重载到operator&lt;&lt; 的东西被“捕获”),之前有指针:是 lambda abc 的类型,在这一点上,技术上是某种描述的指针,还是(在 C++ 的法律术语中)完全是别的东西?
  • @DevSolar:我认为这本身就是一个问题——我没有能力彻底回答这个问题,尽管 lambda 具有编译器生成的类型。干得好auto!
【解决方案2】:

正如@Bathsheba 指出的那样。你有一个错字,不要调用 lambda。现在,很明显 operator&lt;&lt; for qDebug() 没有在 lambda 的闭包类型上重载。所以自然地必须发生隐式转换序列。唯一可用的,并且仅因为您的 lambda 是无捕获的,从转换为函数指针开始。

现在,which overload of operator&lt;&lt; 可以用来打印函数指针吗?从表面上看,有两个可能的候选人:

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

那么为什么bool 过载呢?因为函数指针不能隐式转换为void*。有条件地支持该转换,并且必须使用强制转换 ([expr.reinterpret.cast]/8) 执行:

将函数指针转换为对象指针类型,反之亦然 有条件地支持。

剩下的只有[conv.bool]:

算术、无范围枚举、指针或指向的指针的纯右值 成员类型可以转换为布尔类型的纯右值。

【讨论】:

  • ...这让我免于发布我曾问过 Bathsheba 的问题。谢谢你的澄清。 ;-)
  • “只是因为你的 lambda 是无捕获的”——这意味着捕获的 lambda 不能转换为函数指针,而是一种独特的非指针类型?
  • @DevSolar:毕竟你最好问这个问题?然后 StoryTeller 将在 GMT 午餐时间达到代表上限。
  • @DevSolar - lambda 表达式总是引入不同的类型。但是,是的,捕获 lambda 不支持任何转换。唯一明显的是不可用,因为需要考虑状态。
  • @StoryTeller:太棒了。我喜欢你今年定位帽子的方式。
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2012-01-14
相关资源
最近更新 更多