vso*_*tco 13 c++ lambda c++11 type-deduction
据我所知,在标准C++ 11(不是C++ 14)中,当省略lambda的返回类型时,其返回类型推断为:
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,DR1048和N3638.
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支持附带的编译器版本.