为了账号安全,请及时绑定邮箱和手机立即绑定

C++ lambda返回类型

C++ lambda返回类型

C++
慕姐3585284 2016-10-23 02:33:02
在最新版的《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 回答

?
拥小山

TA贡献3条经验 获得超0个赞

我的primer怎么没有lambda介绍?不包含c11新增的?

查看完整回答
反对 回复 2016-10-23
  • 慕姐3585284
    慕姐3585284
    这。。。可能是看漏了吧。 lambda表达式并不是一个新鲜的功能。
  • 慕姐3585284
    慕姐3585284
    对了,《C++ Primer》和《C++ Primer Plus》是不同的书。 我看的是第一本,对第二本的内容不清楚,莫混淆了。
  • 拥小山
    拥小山
    Plus内容有点多,,,没敢看哈哈
点击展开后面1
?
拥小山

TA贡献3条经验 获得超0个赞

return type can't deduce 是因为有两个return;我这样理解有错吗?

查看完整回答
反对 回复 2016-10-23
  • 慕姐3585284
    慕姐3585284
    嗯,有点问题。 我知道问题的所在了,我在后面添加一个回答。
  • 慕姐3585284
    慕姐3585284
    我写在了给第一个回答的人的回复中了,就不另添加一个回答了。
  • 拥小山
    拥小山
    好的谢谢楼主!(:
?
拥小山

TA贡献3条经验 获得超0个赞

对于“若lambda的函数体包含单一return语句之外的内容,且未指定返回类型,则返回void。”这句话我的理解是在return语句之外的内容返回类型为空,而不是匿名函数返回空。

查看完整回答
反对 回复 2016-10-23
?
onemoo

TA贡献883条经验 获得超454个赞

另外,想搭车问问题主:你觉得这次的翻译质量如何?

查看完整回答
反对 回复 2016-10-23
  • 笑着哭自己
    笑着哭自己
    就阅读来说,我其实还是推荐用原版,对于英语稍差的人来说,读这本书后,明显可以感觉自己的英语阅读,听力都会得到提升,刚开始读得确实很慢,但是到后面的速度并不慢。这本专业书的陌生词汇,就章节来说并不多。对于时间上充足的我们学生,我认为读原版好。
  • 4 回答
  • 0 关注
  • 3884 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信