Я сижу и думаю о том, нужно ли мне часто использовать const char* или const std::string&, когда я разрабатываю интерфейсы классов, и когда дело доходит до него, я часто чувствую, что там 6 в одной руке с полдюжины в другом.
Возьмите следующие два прототипа функций:
void foo(const char* str);
void foo(std::string str);
Если функция foo должна была хранить строку, я бы сказал, что вторая - лучший вариант из-за способности передавать строку и использовать семантику перемещения, где это возможно. Однако, если foo нужно было только прочитать строку, было бы лучше решение const char*?
С точки зрения производительности временный std::string не нужно создавать. Однако вызов функции с уже существующей строкой в качестве аргумента выглядит навязчивым: foo(mystr.c_str()). Хуже того, если более сложные операции необходимо выполнить в массиве в какой-то момент по дороге или если копия должна быть сохранена, тогда интерфейс должен измениться.
Итак, мои вопросы таковы:
Есть ли четко определенные, личные или иные соглашения, которые правило, когда std::string или const char* является лучшим выбором? Кроме того, при запуске нового проекта лучше всего быть совместимым с использованием или просто взять тот, который лучше всего подходит для текущего фрагмента кода?