什么时候可以省略C++ 11 lambda中的返回类型?

vso*_*tco 13 c++ lambda c++11 type-deduction

据我所知,在标准C++ 11(不是C++ 14)中,当省略lambda的返回类型时,其返回类型推断为:

  1. 返回表达式的类型,只要lambda只包含带有表达式的单个return语句,或者
  2. void 在所有其他情况下.

现在考虑这段代码:

#include <iostream>

auto closure = [](int x)
{
    x++;
    return x;
};

int main()
{
    int y = closure(10);
    std::cout << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这应该属于案例2.但是代码编译好像是带有auto类型推导的C++ 14 ,在g ++ 4.9.2,g ++ 5和clang ++中都有-pedantic -Wall -Wextra -std=c++11.这里发生了什么?我是否解释了标准错误?

Pra*_*ian 12

您的代码在没有任何警告的情况下被接受,因为原始的C++ 11限制被认为是标准中的缺陷,允许实现修复行为.参见CWG DR975,DR1048N3638.

975.对lambdas的返还类型扣除的限制

[作为论文N3638的一部分,在2013年4月的会议上移至DR状态.]

似乎没有任何技术上的困难需要当前的限制,即只有当lambda的主体由一个return语句组成时,才能推导出lambda的返回类型.特别是,如果它们都返回相同的类型,则可以允许多个return语句.

1048.自动扣除和lambda返回类型扣除.

...

2014年11月会议记录:

CWG同意N3638文件中体现的变更应被视为针对C++ 11的DR.

总之,DR975建议修改lambda表达式的返回类型推导规则,以允许多个return语句.

DR1048标识了一个差异,其中使用占位符类型推断正常函数的返回类型auto的规则与DR975中提出的规则略有不同.具体来说,正常函数的返回类型推导会在所有情况下丢弃顶级cv限定符,而lambda表达式的返回类型将保留类类型的cv限定符.

N3638解决了这个问题.


我怀疑有没有办法恢复到原来的行为,而不是在上面的DR实现之前找到C++ 11 lambda支持附带的编译器版本.


Ben*_*igt 5

当编译器编写者认为同时实现这两个规则太复杂时,某些 C++14 规则可在 C++11 模式中使用。