相关疑难解决方法(0)

C++ 11中的递归lambda函数

我是C++ 11的新手.我正在编写以下递归lambda函数,但它不编译.

sum.cpp

#include <iostream>
#include <functional>

auto term = [](int a)->int {
  return a*a;
};

auto next = [](int a)->int {
  return ++a;
};

auto sum = [term,next,&sum](int a, int b)mutable ->int {
  if(a>b)
    return 0;
  else
    return term(a) + sum(next(a),b);
};

int main(){
  std::cout<<sum(1,10)<<std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

vimal @ linux-718q:〜/ Study/09C++/c ++ 0x/lambda> g ++ -std = c ++ 0x sum.cpp

sum.cpp:在lambda函数中:sum.cpp:18:36:错误:' ((<lambda(int, int)>*)this)-><lambda(int, int)>::sum'不能用作函数

gcc版本

gcc版本4.5.0 20091231(实验性)(GCC)

但如果我改变sum()下面的声明,它的作用是:

std::function<int(int,int)> sum = [term,next,&sum](int a, …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

127
推荐指数
8
解决办法
6万
查看次数

C++ 1y返回类型推断

使用一些Hindley-Milner类型推断变体的编程语言可以很容易地推断出表达式的类型,例如

let rec fix f x = f (fix f) x 
Run Code Online (Sandbox Code Playgroud)

而C++ 1y中的返回类型推断因以下原因而失败:

int main() {
  auto fix =
  [&](auto f) {
    return [&](auto x) {
      return f(fix(f))(x);
    };
  };
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用clang 3.5和命令试了这个

clang++ -std=c++1y fix.cc
Run Code Online (Sandbox Code Playgroud)

我明白了

fix.cc:7:18: error: variable 'fix' declared with 'auto' type cannot appear in its
own initializer
    return f(fix(f))(x);
Run Code Online (Sandbox Code Playgroud)

C++的返回类型推断中缺少什么,当必须推断返回类型时,它不允许在它自己的初始化器中使用变量?我可以做些什么来解决这个问题,更好的是,我们可以做些什么来解决这个问题?

recursion type-inference c++11 return-type-deduction c++14

4
推荐指数
1
解决办法
587
查看次数