我是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>&&’
。
你能告诉我为什么会这样吗?
提前谢谢。
答案 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';
并打印出val1
和val2
的总和。