Не хочу ограничивать ваш энтузиазм по этому поводу, но реально неэффективно смешивать множество строковых типов в одном проекте, поэтому, чем больше проект, тем больше неизбежно он должен опираться на std :: string(который является typedef для создания экземпляра basic_string в STL для типа char, а не для другой сущности), учитывая, что это единственная стандартная опция семантического значения.char * подходит в основном для строк фиксированного размера (например, строковых литералов, буферов фиксированного размера) или для взаимодействия с C.
Почему я говорю, что это неэффективно?Вы получите ненужные экземпляры шаблонов для множества строковых аргументов (перестановки даже для нескольких аргументов).Вы обнаруживаете, что вызываете функции, которые хотят загрузить результат в строку &, а затем должны вызвать .c_str () для этого и создать какой-то другой тип, делая избыточное выделение памяти.Даже const std :: string & требует строку временную, если она вызывается с использованием ASCIIZ char * (например, для буфера некоторого другого строкового типа).Когда вы хотите написать функцию для обработки типа строки, которую хочет использовать конкретный вызывающий объект, вас подталкивают к шаблонам и, следовательно, встроенному коду, более длительному времени компиляции и зависимостям перекомпиляции (есть некоторые способы смягчить это, но они становятся сложнымии чтобы быть удобными или автоматизированными, они, как правило, требуют изменений в различных типах строк - например, оператор приведения или функция-член, возвращающая некоторый общий интерфейс / прокси-объект).
В проектах может потребоваться использование нестандартных типов строк для взаимодействияс библиотеками, которые они хотят использовать, но вы хотите минимизировать это и по возможности ограничить распространение.