c++ primer第5版,书上说如果lambda体中包含return之外的任何语句,则编译器假定此lambda返回void。与其他返回void的函数类似,被推断返回void的lambda不能返回值。
我按照书上的例子写了下,基于c++ 11 14都能正常编译运行,请问下我哪里理解错了?
#include <bits/stdc++.h>
using namespace std;
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr)/sizeof(arr[0]);
transform(arr, arr+n, arr, [](int i){if(i<0) return -i;else return i + 1;});
for (int i=0; i<n; i++)
cout << arr[i] << " ";
return 0;
}
这个从 c++14 开始就不是这样了。没有 trainling return type 的 lambda 返回 auto ,由函数体推断。
你还可以在 gcc 4.6 里看到 c++11 的行为。最后一个版本是 4.6.4,2013.4.12 发布
从 gcc 4.7 开始(4.7.0 2012.3.22 发布),c++11 的这一个行为已经不再支持,即使指定
-std=c++11
/-std=c++0x
。在这里可以测试不同版本的编译器。