В дополнение к обоснованию, приведенному в спецификации (неожиданные сюрпризы), если вы смешиваете вызовы API C с помощью std :: string, вам действительно нужно привыкнуть использовать метод :: c_ctr (). Если вы когда-либо вызываете функцию varargs (например, printf или эквивалентную), для которой требуется const char *, и вы передаете std :: string напрямую (без вызова метода извлечения), вы не получите ошибку компиляции (нет типа проверка функций varargs), но вы получите ошибку времени выполнения (макет класса не является двоичным, идентичным const char *).
Кстати, CString (в MFC) использует противоположный подход: он имеет неявное приведение, а компоновка класса двоично-совместима с const char * (или const w_char *, если компилируется для строк широких символов, то есть: "Unicode" «).