Зачем вообще сейчас этот COW при наличии move semantics?
И как мув поможет пошарить RO данные в строках, например, между несколькими потоками? Многие этим раньше пользовались, а теперь могут словить приличный прирост в RSS на новых строках.
Суть в том, что если функция возвращает const, значит туда писать нельзя. Потенциально такая память вообще спроецирована как RO может быть. То, что детали реализации конкретной функции позволяют писать по const-указателю, ничего не значит. Вспомни историю с memcpy. Стандарты надо чтить.