c++ - "invalid initialization of non-const reference of type ‘int&’ 来自类型为 ‘int’ 的右值 ": Recursive pass-by-reference function

标签 c++ recursion

我在 C++ 类中有一个递归函数,如下所示:

Class myClass{
    private:
       static const int MAX_ALPHA = 1000;
       static const int MAX_BETA = -1000;
    public:
       void startSearch();
       int  search(int& alpha, int& beta, int h);
       int  value();
   };

实现看起来像这样:

void Class::startSearch(){
   int alpha = MAX_ALPHA;
   int beta = MAX_BETA;
   int h = 10;
   int score = search(alpha, beta, h);
}

int search(int& alpha, int& beta, int h){
   if(h == 0){
      return value(); 
   }
   //do some stuff
   int score = search(-beta, -alpha, h-1); // ERROR HERE
   //do some more stuff
   return score;
}

我很困惑为什么当我调用 search() 函数时编译器会给我一个错误。它说:“错误:从类型右值对类型 'int&' 的非常量引用进行无效初始化int'”。当我不通过引用传递时,问题就消失了 - 但是,我想通过引用传递。

感谢任何帮助,如果需要,我也很乐意提供有关该问题的更多信息。谢谢!

最佳答案

请注意,operator- 返回的结果是右值;所以 -beta-alpha 都是右值,然后不能绑定(bind)到 int 的左值引用,即 int&.

您可以改为传递左值;如果您不想更改函数的参数类型(并且参数应该被修改为按引用传递)。例如

int search(int& alpha, int& beta, int h){
   if(h == 0){
      return value(); 
   }
   //do some stuff
   alhpa = -alpha;
   beta = -beta;
   int score = search(beta, alpha, h-1);
   //do some more stuff
   return score;
}

关于c++ - "invalid initialization of non-const reference of type ‘int&’ 来自类型为 ‘int’ 的右值 ": Recursive pass-by-reference function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513183/

相关文章:

javascript - 从 Javascript 中的复杂嵌套对象值构建字符串

c# - 在 C# 中使用递归时,代码是线性处理还是伪并行处理?

c++ - 使用模板输入双关语

c++ - `emit dataChanged( ... );` 不触发 View 显示更新的可能原因是什么?

c++ - 我应该缓存 OpenGL 状态,例如当前绑定(bind)的缓冲区,还是 OpenGL 会这样做?

scala - 在 Scala 中编写斐波那契函数的最快方法是什么?

c++ - 递归函数如何返回它的值?

c - C中的递归。使非递归函数成为递归函数

c++ - Arduino:将 uint64_t 转换为字符串

c++ - 没有构造函数 "RobotDriveSwerve::RobotDriveSwerve"的实例与参数列表匹配——参数类型是