在最新版的《C++ Primer》中有这么一句话:
若lambda的函数体包含单一return语句之外的内容,且未指定返回类型,则返回void。
然后我做了如下测试:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main(void) { vector<int> vi{ 1, -2, 3, -4, 5, -6 }; /*lambda表达式返回void?*/ /*标准写法:[](int i) -> int { if(i < 0) return -i; else return i; } */ 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; }
可不管是在Dev-C++中还是在Visual Studio中,它都能正确编译并且执行。
如果lambda在这里返回void,就应该会编译错误才是啊?
这是为什么呢?
然后我在Visual Studio上又添加了这样的一段代码:
auto f = [](int i) { if (i < 0) return -i; else return i; };
在visual assistX的帮助下,鼠标移动到f,它显示的返回类型也是int。
《C++ Primer》写错的可能性不大,比较可能的是编译器的问题。难道是编译器都不完全遵循C++标准吗?
或者是C++14有什么新规定吗?
为防止翻译的误差,我也特地找了原版来看,也是如此的:
Lambda with function bodies that contain anything other than a single return statement that do not specify a return type return void.
via 《C++ Primer》 5th Edition, Page 389.
However, if we write the seemingly equivalent program using an if statement, our code won't compile:
//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; } );
via 《C++ Primer》 5th Edition, Page 396.
拥小山
拥小山
拥小山
onemoo
相关分类