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

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

本文关键字:常量 引用 初始化 无效 非常 std 类型 string      更新时间:2023-10-16

我正在尝试在不使用算法的情况下使用来自 c++ 字符串标头的函数rtrim()来修剪字符串。
我所做的是检查开始和结束位置是否存在空间,只需使用 isspace() 将其删除,但是当我编译时,现在我收到此错误:

从类型为"const char*"的右值初始化为"std::string&{aka std::basic_string&}"的非常量引用无效

这是我的代码:

#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 worldt ") << "|" << endl;
}

每当我设置参数(例如string s = ( "hello worldt ");并运行)时,cout << rtrim(s) << endl;似乎都可以工作,但它不能像上面的代码那样工作。 有什么建议吗?

上面的代码将在堆栈上创建临时std::string对象,并将其作为非常量引用传递给函数。这是危险的,因为该函数可能会修改对象(这没有意义)或记住对对象的引用,并在对象已被销毁后尝试将其修改出其范围。

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