我用__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()>
现在,我并不感到惊讶的是,他们并没有被认为是同一类型 - 只是他们不同并且没有在他们的签名中反映出来。 (当lambdas返回null时,它的工作方式相同。)为什么会这样?
我还要指出返回类型根本没有显示,我从未在常规函数中看到过这种类型。我确定返回类型是强类型的并且是lambda类型的基本部分,那么为什么它会被省略?
答案 0 :(得分:5)
每个lambda 表达式表示唯一闭包类型。
lambda表达式的类型(也是闭包的类型) object)是一个唯一的,未命名的非联合类类型,称为闭包 类型,其属性如下所述。
至于为什么__PRETTY_FUNCTION__
呈现相同的内容,你必须问实施者(它不是一个标准的宏),但是猜测它很难去将名称变得既独特又具有代表性。