【发布时间】:2020-09-04 12:26:34
【问题描述】:
根据 c++ 标准,lambda 函数具有唯一的类型,因此通常两个 lambda 不能与 ? 运算符一起使用。但是,正如this question 中所讨论的,没有捕获的 lambda 可以转换为函数指针。因此,以下代码可以正确编译:
int main()
{
bool x = true;
auto a_lambda = x ? [](int p) { } : [](int p) { };
}
但是,如果 lambda 的参数声明为 auto
int main()
{
bool x = true;
auto a_lambda = x ? [](auto p) { } : [](auto p) { };
}
代码不再编译,报错:
main.cpp:4:23: error: operands to ?: have different types 'main()::<lambda(auto:1)>' and 'main()::<lambda(auto:2)>'
4 | auto a_lambda = x ? [](auto p) { } : [](auto p) { };
如果我强制分配给带有参数int 的函数,代码也不会编译:
#include <functional>
int main()
{
bool x = true;
// error: operands to ?: have different types 'main()::<lambda(auto:1)>' and 'main()::<lambda(auto:2)>'
std::function<void(int)> a_lambda = x ? [](auto p) { } : [](auto p) { };
}
分配给具有给定签名的函数后,参数列表中的auto 应适用于推导出为int 的两个lambda。
为什么这两个 lambda 仍然是不同的类型?
有没有办法修复第二个代码,即是否可以在参数列表中有
auto的两个 lambdas 之间使用?运算符“选择”,如果我确定的话对于两个 lambda,auto将被推导出为相同的类型?
【问题讨论】:
-
如果您确定推导的类型是什么,那么明确说明它有什么问题?
-
auto a_lambda = x ? function<void(int)>([](auto p) { }) : function<void(int)>([](auto p) { }); -
@cigien 就像任何其他
auto一样,当推导复杂时,有时使用它而不是“整理”类型更容易。 -
我不知道为什么它会很复杂,因为您必须已经知道将其放入
std::function的类型。