Класс string не должен хранить строку с завершающим 0. На самом деле ему даже не нужно хранить их в непрерывной памяти, если он этого не хочет.Поэтому неявное приведение не имеет смысла, так как это может быть дорогостоящей операцией.
Функция c_str () затем дает вам c-строку.В зависимости от того, как библиотека хранит это внутренне, эта функция может создать временную.Этот временный код действителен только до тех пор, пока вы не измените строку.
К сожалению, это так, поскольку строку можно было просто указать как внутреннюю строку c.Это не приведет к потере функциональности и позволит неявное преобразование.
Редактировать Стандарт в основном подразумевает, что память является смежной (если доступ осуществляется через data () или []оператор), хотя это не должно быть внутренне, и, конечно, не завершено нулем.Вероятно, все реализации также хранят 0.Если бы это было стандартизировано, то неявное преобразование могло бы быть безопасно определено.