为什么c++ 0x中的Lambda函数返回类型必须是auto

Why Lambda Function in C++0x return type has to be auto?

本文关键字:auto 返回类型 函数 c++ 0x 中的 Lambda 为什么      更新时间:2023-10-16

我是一个c++新手。我只是尝试一些小代码片段来理解使用GCC 4.6.3与-std=c++0x编译的lambda函数。我知道它对c++ 0x来说不是最好的,但是它支持lambda表达式。我写了这个:

int main(){
    int val1 = 0, val2 = 0;
    std::cout << "Enter Value1" << 'n';
    std::cin >> val1;
    std::cout << "Enter Value2" << 'n';
    std::cin >> val2;
    auto result = [&val1, &val2](){return (val1 + val2);};
    std::cout << "Result: " << [](int x, int y){return(x + y);}(32, 46) << 'n';
    //std::cout << "Result: " << [&val1, &val2](){return (val1 + val2) ;} << 'n';
    return 0;
}

我的第一个问题是,当我已经知道预期(隐式)结果将是int时,为什么我必须定义resultauto ?在代码的注释行,我得到一个错误error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’。你能告诉我为什么会这样吗?

您似乎对函数的结果和函数本身感到困惑。在这一行

auto result = [&val1, &val2](){return (val1 + val2);};

您正在创建一个lambda函数(在=的右侧),并将其分配给一个名为result的变量。这里的auto表示保存lambda函数的变量的类型,而不是lambda函数的返回类型。

如果你想让返回类型显式,可以这样做:

auto result = [&val1, &val2]() -> int {return (val1 + val2);};

如果您想使result的类型更明确,您可以使用std::function:

std::function<int()> result = [&val1, &val2]() {return (val1 + val2);};

同样,由于result是一个函数,您可以这样使用result:

std::cout << result() << "n";

在您的示例中,result是一个函数(注意您不执行匿名函数)。在

一行
std::cout << "Result: " << [&val1, &val2](){return (val1 + val2) ;} << 'n';

您试图输出一个函数,而不是应用该函数的结果。改为

std::cout << "Result: " << [&val1, &val2](){return (val1 + val2) ;}() << 'n';

,输出val1val2的和