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

5 c++ lambda auto c++11

我是C++的新手.我只是尝试了几个小代码片段来理解使用GCC 4.6.3编译的lambda函数-std=c++0x.我知道它不是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;
}
Run Code Online (Sandbox Code Playgroud)

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

Vau*_*ato 9

你似乎对函数的结果和函数本身感到困惑.在这条线上

auto result = [&val1, &val2](){return (val1 + val2);};
Run Code Online (Sandbox Code Playgroud)

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

如果你想使返回类型是显式的,它将这样做:

auto result = [&val1, &val2]() -> int {return (val1 + val2);};
Run Code Online (Sandbox Code Playgroud)

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

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

此外,既然result是一个函数,你会这样使用result:

std::cout << result() << "\n";
Run Code Online (Sandbox Code Playgroud)