Ответ 1
Об этих проблемах стоит знать:
std::string_view
не обязательно должен бытьnull
-terminated. Таким образом, если вы замените частьconst char*
наstring_view
и замените конструкцию подстрокиnull
-terminatedchar*
наstring_view
черезstd::string_view::substr
, вы не сможете передать основной указатель на API которая ожидает строкуnull
-terminated. Пример (без UB, но это тоже легко построить):void legacy(const char *str) { std::printf("%s\n", str); } constexpr std::string_view sv1 = "abcde"; constexpr std::string_view sv2 = sv1.substr(0, 2); // view on "ab" legacy(sv2.data()); // Not intended: prints "abcde"
Хотя вы можете неявно построить
std::string
изconst char*
, вы не можете сделать это сstd::string_view
. Идея заключается в том, что глубокое копирование не должно происходить под прикрытием, а только по явному запросу. Пример:std::map<std::string, int> m; constexpr std::string_view sv = "somekey"; constexpr const char *old = "somekey"; m[old] = 42; // works as expected m[sv] = 42; // fails to compile m[std::string(sv)] = 42; // be explicit, this is ok
В зависимости от существующего использования глобальных экземпляров
const char*
в вашем проекте, это может потребовать ручного вмешательства в различных местах.