无效初始化类型为'std :: string&的非const引用;

时间:2016-01-28 11:06:19

标签: c++ std pass-by-reference lvalue reference-binding

我试图通过在c ++中使用字符串头中的函数rtrim()来修剪字符串,而不使用算法 我做的是检查开始和结束位置,如果存在空间,只需使用isspace()删除它,但是当我编译时,现在我收到此错误:

  

'std :: string&类型的非const引用的无效初始化{aka std :: basic_string&}'来自'const char *'

类型的右值

这是我的代码:

#include <iostream>
#include <string>
using namespace std;

string rtrim(string& s) {
    size_t i;
    for(i = s.length() - 1; i != (size_t)-1; i--) {
        if(!(isspace(s[i]))){
            break;
        }
    }
    return s.substr(0, i + 1);
}

int main(){
    cout << "|" << rtrim("   hello world\t ") << "|" << endl;
}

每当我设置string s = ( "hello world\t ");之类的参数并运行cout << rtrim(s) << endl;似乎都有效但它不像上面的代码一样工作。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

上面的代码将在堆栈上创建std::string的临时对象,并将其作为非const引用传递给函数。这很危险,因为函数可以修改对象(没有意义)或记住对象的引用,并在对象被破坏后尝试将其修改到其范围之外。

在您的功能中,您实际上不需要non-const引用,因此只需将参数更改为const std::string &s即可。