据我所知know http://en.cppreference.com/w/cpp/language/lambda,在标准 C++11 中(不是 C++14),当省略 lambda 的返回类型时,其返回类型推导为:
- 当 lambda 仅包含带有表达式的单个 return 语句时,返回表达式的类型,或者
-
void
在所有其他情况下。
现在考虑这段代码:
#include <iostream>
auto closure = [](int x)
{
x++;
return x;
};
int main()
{
int y = closure(10);
std::cout << y << std::endl;
}
这应该属于情况 2。但是代码编译起来就像 C++14 一样auto
类型推导,在 g++4.9.2、g++5 和 clang++ 中,-pedantic -Wall -Wextra -std=c++11
。这里发生了什么?我对标准的解释是否错误?
您的代码在没有任何警告的情况下被接受,因为原始 C++11 限制被认为是标准中的缺陷,它允许实现修复该行为。参见 CWGDR975 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#975, DR1048 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1048 and N3638 https://isocpp.org/files/papers/N3638.html.
975. 对 lambda 返回类型推导的限制
[作为 N3638 号文件的一部分,在 2013 年 4 月的会议上转为 DR 状态。]
似乎没有任何技术困难需要当前的限制,即仅当 lambda 主体由单个 return 语句组成时才能推导 lambda 的返回类型。特别是,如果多个 return 语句都返回相同的类型,则可以允许它们。
1048.自动推导和lambda返回类型推导。
...
2014 年 11 月会议记录:
CWG 同意文件中体现的变更N3638应该被认为是针对C++11的DR.
总之,DR975 建议修改 lambda 表达式的返回类型推导规则,以允许多个返回语句。
DR1048 发现使用占位符类型推导正常函数的返回类型的规则存在差异auto
与 DR975 中提出的规则略有不同。具体来说,普通函数的返回类型推导将在所有情况下丢弃顶级 cv 限定符,而 lambda 表达式的返回类型推导将保留类类型的 cv 限定符。
N3638 解决了这个问题等。
我怀疑除了在实现上述 DR 之前找到附带 C++11 lambda 支持的编译器版本之外,是否有任何方法可以恢复到原始行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)