2016-01-28 98 views
1

非const引用的无效初始化我想通过使用函数rtrim()从C++中的字符串头部修剪字符串而不使用算法。 我所做的是我检查开始和结束位置,如果有空间存在,只需使用isspace()删除它,但是当我编译时,现在我得到此错误: 无效初始化类型为'std :: string & {又名性病:: basic_string的&}”从类型的右值‘为const char *’类型'std :: 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 world\t ") << "|" << endl; 
} 

每当我设置的参数,如string s = ( "hello world\t ");和运行cout << rtrim(s) << endl;似乎是工作但它不能像上面的代码那样工作。有什么建议么?谢谢。

回答

0

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

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

相关问题