具有函数体的Lambda,该函数体包含除了未指定返回类型的单个return语句之外的任何内容,返回void.
通过"C++ Primer"第5版,第389页.
但是,如果我们使用if语句编写看似等效的程序,我们的代码将无法编译:
Run Code Online (Sandbox Code Playgroud)//error: can't deduce the return type for the lambda. transform(vi.begin(), vi.end(), vi.begin(), [](int i) { if(i < 0) return -i; else return i; } );通过"C++ Primer"第5版,第396页.
我在Visual Studio中编写了一个程序:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(void) {
vector<int> vi{ 1, -2, 3, -4, 5, -6 };
/* Is the return type void? */
transform(vi.begin(), vi.end(), vi.begin(), [](int i) {
if (i < 0) return -i;
else return i; });
for (int i : vi)
cout << i << " ";
cout << endl;
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它可以正确运行.
然后,我在Visual Studio中添加一些语句:
auto f = [](int i) {
if (i < 0) return -i;
else return i; };
Run Code Online (Sandbox Code Playgroud)
当我将光标移动到f时,它向我显示f的返回类型是int.
为什么是这样?
我很迷惑.
C++ Primer第5版涵盖C++ 11,而在C++ 11中,您引用的陈述是正确的.但是,C++ 14支持在更多情况下推导返回类型,包括lambda具有多个return语句,只要它们都返回相同的类型.据推测,您的Visual Studio版本支持C++ 14,或者至少是它的这一功能.
| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |