为什么Lambda函数在C ++ 0x返回类型必须是自动的?

时间:2013-06-04 12:54:03

标签: c++ c++11 auto lambda

我是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;
}

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

2 个答案:

答案 0 :(得分:10)

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

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";

答案 1 :(得分:4)

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

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

您正在尝试输出函数,而不是应用函数的结果。将其更改为

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

并打印出val1val2的总和。