Объявление строки С++ является следующим:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
CharT - тип символа, который может быть char, wchar_t, char16_t и char32_t; но в конце концов basic_string является шаблоном, поэтому его можно создать с помощью других CharT и других распределителей. Хотя я могу думать в некоторых случаях использования для других распределителей, я не могу думать в случаях использования для строк других типов данных, например:
using string = std::basic_string<int>;
Используя цепочку целых чисел, мы не можем инициализировать ее как строку (очевидную), а не строку u32 (что не очевидно, по крайней мере для меня); но мы можем инициализировать его с помощью initializer_list, пока содержащийся тип списка может быть конвертирован в int:
string err1("test"); // Error!
string err2(U"test"); // Error!
string err3{"test"}; // Error!
string err4{U"test"}; // Error!
string err5 = "test"; // Error!
string err6 = U"test"; // Error!
string success1({U't', U'e', U's', U't'});
string success2 = {U't', U'e', U's', U't'};
string success3({'t', 'e', 's', 't'});
string success4 = {'t', 'e', 's', 't'};
Но даже если нам удастся инициализировать целую строку, мы не сможем использовать ее обычным способом:
std::cout << success1; // Error! expected 116101115116
Единственный basic_string, который, как ожидается, будет использоваться с cout, является нормальным, что имеет смысл: ведь мы не можем предположить, как предполагается напечатать строку целых чисел или строку MyFancyClass es.
Но в любом случае создание странных экземпляров basic_string не запрещено; с одной стороны, не запрещается из-за отсутствия признаков, запрещающих использование (иначе говоря, понятий), а по другому кодированию basic_string без ограничения базового типа проще, чем делать это наоборот (без понятий), так что это делает меня удивляет:
- Используется ли для
std::basic_string<T>гдеTне тип символа?
Что касается любого использования, я думаю о вещах, которые могут быть достигнуты только с помощью строк T, и это невозможно сделать с помощью вектора T (или это будет значительно сложнее), другими словами:
- Вы когда-нибудь сталкивались с ситуацией, когда строка
Tявляется лучшим выбором?