【问题标题】:Why does a lambda convert to a bool whose value is true?为什么 lambda 转换为值为 true 的 bool?
【发布时间】:2017-06-02 22:10:52
【问题描述】:
#include <iostream>

void IsTrue(const bool value) {
  if (value) {
    std::cout << "value is True!\n";
  }
}

int main()
{
  IsTrue([]() { ; /* some lambda */ });

  return 0;
}

输出:

value is True!

为什么 lambda 在 GCC 和 Clang 上的计算结果为 true? MSVC 无法构建它(无法将 lambda 转换为 bool)。

这是一个编译器错误吗?或者标准的哪一段允许这样做?

【问题讨论】:

标签: c++ lambda boolean language-lawyer


【解决方案1】:

C++14 标准 (§5.1.2) 说:

非泛型 lambda 表达式的闭包类型,没有 lambda-capture 具有公共的非虚拟非显式 const 转换 函数指向函数的指针 与 C++ 语言链接 (7.5) 具有与闭包类型相同的参数和返回类型 函数调用运算符。此转换函数返回的值 应该是一个函数的地址,当被调用时,它具有相同的 效果如同调用闭包类型的函数调用运算符。

由于函数指针可以隐式转换为bool,因此您会得到所显示的结果。这是完全合法的。

MSVC 不编译它,因为这个转换运算符被不同的调用约定(__stdcall__cdecl 等)重载。 在为x64 编译时,所有这些调用约定都没有使用,所以只有一个转换运算符,它编译得很好。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2011-01-03
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多