首页 > 解决方案 > 为什么这些 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 类型的基本部分,那么为什么要省略它呢?

标签: c++lambdatypesc++14

解决方案


每个 lambda表达式表示一个唯一的闭包类型。

[expr.prim.lambda.closure]

lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型,称为闭包类型,其属性如下所述。

至于为什么__PRETTY_FUNCTION__呈现相同,您必须询问实施者(它不是标准宏),但猜测很难分解为一个既独特又具有代表性的名称。


推荐阅读