为什么 lambda 会转换为值为真的布尔值?
Why does a lambda convert to a bool whose value is true?
#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 转换为布尔值)。
是编译器错误吗?或者标准的哪一段允许这样做?
C++14 标准 (§5.1.2) 说:
没有 lambda 捕获的非泛型 lambda 表达式的闭包类型具有公共非虚拟非显式 const函数到指向具有C++语言链接的函数的指针(7.5) 具有与闭包类型相同的参数和返回类型 函数调用运算符。此转换函数返回的值 应是函数的地址,该函数在调用时具有相同的 作为调用闭包类型的函数调用运算符的效果。
由于函数指针可隐式转换为bool
,因此您可以获得所显示的结果。这是完全合法的。
MSVC 不会编译它,因为这个转换运算符重载了不同的调用约定(__stdcall
、__cdecl
等)。 编译时x64
不使用所有这些调用约定,因此只有一个转换运算符,并且可以正常编译。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- fstream / ifstream / ofstream 对象如何转换为布尔值
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 为什么布尔值不能比作最后一点?
- 如何使用返回布尔值的函数?
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- 为什么 lambda 会转换为值为真的布尔值?