我使用C ++ 11 lambdas非常多,而且我经常遇到多行lambdas的编译错误,因为我忘了添加返回类型,正如预期的那样,但我最近碰到了一个没有的例子有这个问题。它看起来像这样:
auto testLambda = [](bool arg1, bool arg2)
{
if (arg1)
{
if (!arg2)
{
return false;
}
return true;
}
return false;
};
即使没有指定返回类型,这也很好。这只是Visual Studio是愚蠢的,允许它不应该的东西,或者lambda只能总是演绎内在的类型?
我尝试使用所有整数或浮点值的返回值,它也编译得很好。我刚刚发现这真的很令人惊讶所以我想在我开始做出假设并省略可能在以后破坏的返回类型之前绝对确定它是如何工作的。
答案 0 :(得分:3)
Lambdas遵循与auto-returning functions相同的模板扣除规则:
模板参数推导用于函数声明,当从return语句推断出函数返回类型中auto指令符的含义时。
对于自动返回函数,参数 P 获得如下:在T中,包含auto的函数的声明返回类型,每次出现的auto都被一个虚构的类型模板参数替换U.参数 A 是return语句的表达式,如果return语句没有操作数, A 是
void()
。按照上述规则从 P 和 A 中扣除U后,将推导出的U代入T以获得实际的返回类型:auto f() { return 42; } // P = auto, A = 42: // deduced U = int, the return type of f is int
如果此函数具有多个return语句,则会对每个return语句执行推导。所有结果类型必须相同并成为实际的返回类型。
如果此类函数没有返回语句,则在推导时 A 为
void()
。注意:变量和函数声明中
decltype(auto)
占位符的含义不使用模板参数推导。