为什么c++ 0x中的Lambda函数返回类型必须是auto
Why Lambda Function in C++0x return type has to be auto?
我是一个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
时,为什么我必须定义result
为auto
?在代码的注释行,我得到一个错误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';
,输出val1
和val2
的和
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- decltype(auto) 是否使尾随返回类型过时?
- 警告:函数使用不带尾随返回类型的'auto'类型说明符
- decltype(auto) 类型演绎:返回 x 与返回 (x)
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- C++14 'auto'能够获取函数返回类型,我们还需要 std::result_of<> 吗?
- 如何在编译时决定'auto'返回类型?
- C++11 中的 decltype(auto) - 推断返回类型
- 基类的返回类型与使用 auto 的派生类冲突
- C++函数,使用'auto'变量返回类型
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 为什么c++ 0x中的Lambda函数返回类型必须是auto
- decltype(auto)和decltype(return expr)作为返回类型有什么区别?
- 使用c++11 auto作为const函数对象的返回类型
- 使用c++ 14使用多个返回类型decltype(auto)