Интересно (следует из разговора в комментариях выше с @Henri Menke о string
s и string_view
s).
Учитывая это:
#include <string>
#include <string_view>
#include <iostream>
static const std::string a = "a";
static const std::string_view b = "b";
int main ()
{
std::cout << a << "\n";
std::cout << b << "\n";
}
На Годболт вы можете ясно видеть, что для создания a
требуется инициализатор времени выполнения, тогда как b
- это константа времени компиляции.
Если вам не нравится читать код, сгенерированный компилятором, попробуйте изменить оба const
s на constexpr
s. Затем std::string_view
все еще компилируется, а std::string
нет.
Таким образом, для статических и / или глобальных константных строк constexpr std::string_view = "blah blah blah";
выглядит здесь как хорошее решение, как говорит Анри, потому что он предлагает дополнительную функциональность по сравнению со старым добрым C- строка, ЕСЛИ вы можете использовать C ++ 17 И вы не возражаете против стоимости преобразования их в std::string
с (что потребует ее создания) в контекстах, где это что нужно в этот момент в коде.
Если нет, вы вынуждены вернуться к std::string
или, возможно, к простым старым C-струнам.
Edit:
Я заметил странный недостаток в std::stringview
, глядя на это: он не предлагает operator std::string ()
метод. Я понятия не имею, почему нет, но это означает, например, что следующее не скомпилируется:
void foo (std::string s)
{
...
}
std::string_view sv = ...;
foo (sv);
Это не достаточно хорошо, говорю я, поэтому в духе обмена мнениями (если кто-то еще читает в этот момент), я смиренно предлагаю вам следующее:
#include <string>
#include <string_view>
template <class T> struct MyBasicStringView : public std::basic_string_view <T>
{
constexpr MyBasicStringView (const T *s) : std::basic_string_view <T> (s) { }
operator std::basic_string <T> () const { return std::basic_string <T> (this->data ()); }
};
using MyStringView = MyBasicStringView <char>;
Тестовая программа:
static constexpr MyStringView a_static_string_view = "static_string";
std::string foo (std::string s)
{
return s + " x";
}
#include <iostream>
int main ()
{
std::cout << a_static_string_view << "\n";
MyStringView sv = "abcde";
std::cout << sv << "\n";
std::cout << foo (sv) << "\n";
}
Выход:
static_string
abcde
abcde x
Живая демоверсия .