Объявление строки С++ является следующим:
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
является лучшим выбором?