c++ - 为什么这些 lambdas 被认为是不同的类型?
问题描述
我发现了这种奇怪的行为__PRETTY_FUNCTION__
,但奇怪的部分更多地与我认为是正确的行为有关,而不是与解错的怪癖有关。我可能是错的。
auto lambda1 = [] { return __PRETTY_FUNCTION__; };
auto lambda2 = [] { return __PRETTY_FUNCTION__; };
//static_assert(std::is_same<decltype(lambda1), decltype(lambda2)>(), "Distinct types!");
std::cout << pretty(lambda1) << "\n" << pretty(lambda2) << std::endl;
lambda1(); // ...with T = main(int, const char**)::<lambda()>
lambda2(); // ...with T = main(int, const char**)::<lambda()>
现在,它们不被认为是同一类型并不让我感到非常惊讶 - 只是它们是不同的并且没有反映在它们的签名中。(当 lambda 返回 null 时,这同样适用。)为什么会这样?
我还要指出,返回类型根本没有显示,这是我从未见过的常规函数中省略的。我确定返回类型既是强类型又是 lambda 类型的基本部分,那么为什么要省略它呢?
解决方案
每个 lambda表达式表示一个唯一的闭包类型。
lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型,称为闭包类型,其属性如下所述。
至于为什么__PRETTY_FUNCTION__
呈现相同,您必须询问实施者(它不是标准宏),但猜测很难分解为一个既独特又具有代表性的名称。
推荐阅读
- excel - 如何发送keys unicode字符VBA - 没有剪贴板
- ansible - Ansible Playbook 使用具有一个或多个值的列表/字典
- hadoop - Spring Cloud 数据流 - http | 卡夫卡和卡夫卡| hdfs - 在 HDFS 中获取原始消息
- swift - Swift4:如何更改 UITableView 单元格颜色
- python - 如何从文件路径列表生成python dict
- ios - 在swift ios中将视图旋转角度重置为零
- sql - SQL Postgres - 插入不存在的地方
- makefile - CMAKE - 包含具有特殊字符的目录
- python - 使用 python 在远程服务器(网络操作系统)中进入 bash 模式
- c - 如何在 C 中使用 send() 计算字节数,包括协议大小?