Если я правильно понимаю, вы хотите видеть одну и ту же строку вывода, выполняющую два приведенных ниже кода:
[1]
s = "beabeefeab";
s.erase(remove(s.begin(),s.end(),'b'),s.end()); //statement 1
cout << s << endl; // eaeefea
[2]
s = "beabeefeab";
s.erase(remove(s.begin(),s.end(),s[0]),s.end()); //statement 2
cout << s << endl; // should be eaeefea
вы можете достичь этого, бросив s[0]
в Rvalue - (char)s[0]
.
Третий параметр алгоритма удаления - const T&
. Когда вы передаете 'b'
- Rvalue привязывается к const char&
, и оно действительно для всего выполнения remove
algo. Когда вы передаете s[0]
- Lvalue, Lvalue связывается с const char&
параметром algo, но при первой операции удаления значение первого элемента, на которое указывает ссылка, изменяется, и удаление алгоритма завершается неудачей.