неверная инициализация неконстантной ссылки типа ‘std :: string & amp;

Я пытаюсь обрезать строку с помощью функции rtrim() из заголовка строки в C ++ без использования алгоритма.
Что я сделал, так это изучил начальную и конечную позицию, если есть место, просто удалите его, используя isspace() но когда я компилирую, теперь я получаю эту ошибку:

неверная инициализация неконстантной ссылки типа ‘std :: string& {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

Решение

Приведенный выше код создаст временный объект std::string в стеке и передать его функции в качестве неконстантной ссылки. Это опасно, так как функция может изменить объект (что не имеет смысла) или запомнить ссылку на объект и попытаться изменить его вне его области, как только объект уже уничтожен.

В вашей функции вам на самом деле не требуется non-const ссылка, поэтому просто измените параметр на const std::string &s и это будет работать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]