Проблема заключается в том, что «const» является неграмотным классификатором. То, что обычно подразумевается под «const string ref», это «не изменять эту строку», а не «не изменять счетчик ссылок». В C ++ просто нет способа сказать , что члены являются «const». Они либо все, либо ни один из них.
Чтобы взломать эту проблему языка, STL может разрешить «C ()» в вашем примере, чтобы в любом случае сделать семантическую копию перемещения , и покорно игнорируют «const» в отношении счетчика ссылок (изменяемый). Пока это было четко указано, все будет хорошо.
Поскольку STL этого не делает, у меня есть версия строки, которая const_casts & lt;> удаляет ссылочный счетчик (без возможности ретроактивно сделать что-то изменчивое в иерархии классов), и - lo and behold - вы можете свободно передавать cmstring в качестве ссылок на const и делать копии их в глубоких функциях в течение всего дня без каких-либо утечек или проблем.
Поскольку C ++ не предлагает «гранулярность производного класса» здесь, написав хорошую спецификацию и создание блестящего нового объекта const constable (cmstring) - лучшее решение, которое я видел.