“从‘int’类型的右值对‘int&’类型的非常量引用进行无效初始化”:递归引用传递函数

ell*_*len 3 c++ recursion

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

\n\n
Class myClass{\n    private:\n       static const int MAX_ALPHA = 1000;\n       static const int MAX_BETA = -1000;\n    public:\n       void startSearch();\n       int  search(int& alpha, int& beta, int h);\n       int  value();\n   };\n
Run Code Online (Sandbox Code Playgroud)\n\n

实现看起来像这样:

\n\n
void Class::startSearch(){\n   int alpha = MAX_ALPHA;\n   int beta = MAX_BETA;\n   int h = 10;\n   int score = search(alpha, beta, h);\n}\n\nint search(int& alpha, int& beta, int h){\n   if(h == 0){\n      return value(); \n   }\n   //do some stuff\n   int score = search(-beta, -alpha, h-1); // ERROR HERE\n   //do some more stuff\n   return score;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

son*_*yao 5

注意返回的结果operator-是右值;so-beta-alpha都是右值,然后不能绑定到对int, ie 的左值引用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;
}
Run Code Online (Sandbox Code Playgroud)