在最新版的《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.
- 4 回答
- 0 关注
- 3884 浏览
添加回答
举报
0/150
提交
取消