类型为‘std::string& 的 non-const 引用的无效初始化

invalid initialization of non-const reference of type ‘std::string&

我正在尝试 trim 通过在 c++ 中使用来自字符串 header 的函数 rtrim() 来 trim 字符串,而不使用算法。
我所做的是检查开始和结束位置是否存在 space,只需使用 isspace() 将其删除但是当我编译时,现在出现此错误:

invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string&}’ from an rvalue of type ‘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; 等参数时,它似乎可以正常工作,但它不能像上面的代码那样工作。有什么建议吗?

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

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