【问题标题】:The lambda return type in C++C++中的lambda返回类型
【发布时间】:2016-10-22 19:24:46
【问题描述】:

具有包含除单个以外的任何内容的函数体的 Lambda 未指定返回类型的 return 语句返回 void。

通过《C++ Primer》第 5 版,第 389 页。

但是,如果我们使用 if 编写看似等效的程序 声明,我们的代码不会编译:

//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;
}

但它可以正常运行。

然后,我在 Visual Studio 中添加了一些语句:

auto f = [](int i) {
                    if (i < 0) return -i;
                    else return i; };

当我将光标移动到 f 时,它显示 f 的返回类型是 int。

这是为什么?

我很困惑。

【问题讨论】:

    标签: c++ lambda


    【解决方案1】:

    C++ Primer 5th Edition 涵盖 C++11,在 C++11 中,您引用的陈述是正确的。但是,C++14 supports deducing return types in more situations,包括当 lambda 具有多个 return 语句时,只要它们都返回相同的类型。大概您的 Visual Studio 版本支持 C++14,或者至少支持它的这个特性。

    【讨论】:

    • 我认为只要它们都返回相同的值应该是只要它们都返回相同的类型
    • 委员会认为已发布的 C++11 标准(和 C++ Primer)中描述的行为是一个缺陷。即使在 C++11 模式下,最新版本的编译器也应该接受这一点。
    • @T.C.有趣,我不知道。
    • @T.C.谢谢你解释。但是我在哪里可以找到有关“委员会决定已发布的 C++11 标准(和 C++ Primer)中描述的行为是缺陷”的信息?
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多