无效初始化类型为'std :: string&amp;的非const引用;来自'std :: basic_string <char>类型的右值

时间:2017-11-13 17:35:33

标签: c++ string c++11

bool hasWord(int y, int x, string &word) {
    if(!inRange(y, x)) return false; 
    if(board[y][x] != word[0])  return false; 
    if(word.size() == 1) return true; 
    for(int direction = 0; direction < 8; direction++) {
        int nextX = x + dx[direction];
        int nextY = y + dy[direction];
        if(hasWord(nextY, nextX, word.substr(1)))  // <--- This
            return true;
    }
return false; }

错误:'std :: string&amp;类型的非const引用的初始化无效来自'std :: basic_string'类型的右值的{aka std :: basic_string&amp;}'    if(hasWord(nextY,nextX,word.substr(1)))

为什么我错了?

2 个答案:

答案 0 :(得分:3)

错误消息说明了一切:从类型std::string 的右值开始,对std::basic_string {aka std::basic_string}类型的非const引用进行无效初始化。

即。对非const的引用不能绑定到临时对象(也称为r值)。该临时对象由word.substr(1)表达式创建。

在声明中:

bool hasWord(int y, int x, string &word)

设为string const& word,因为您不需要可修改的word

答案 1 :(得分:1)

错误的原因在于此次调用

if(hasWord(nextY, nextX, word.substr(1))) 
                         ^^^^^^^^^^^^^^ 

创建了一个std :: string类型的临时对象,并且您正在尝试将非常量引用与临时对象绑定。

如果函数中没有更改字符串,则只需声明类似

的函数
bool hasWord(int y, int x, const string &word) {
                           ^^^^^