Вторая попытка void f(Optimized::String &s) { char &rc = s[0]; // ссылка на 1-й символ Optimized::String s2(s); // копия rc = 'x'; // ОЙ! s2 тоже меняется! } FAIL!
копирует буфер, но и помечает его неразделяемым. • Пометка действует до первой операции, изменяющей строку (после нее ссылки все равно можно считать недействительными).
• Инициализация указателей в конструкторе и не только (лечится с помощью smart pointer). • Неявное преобразование типов (лечится с помощью explicit). • Корректная реализация перегрузки операторов.