C++字符串的声明如下:
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字符串(至少对我来说不是很明显);但只要列表中包含的类型可转换为int
,我们就可以使用initializer_list
进行初始化:
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
唯一可以与
cout
一起使用的basic_string
是普通的那些,这很合理:毕竟我们不能假设一个整数字符串或MyFancyClass
字符串应该如何打印。但不管怎样,创建奇怪的
basic_string
实例并没有被禁止;一方面,由于缺乏禁止这种用法的功能(即概念),另一方面,编写不限制底层类型的basic_string
比相反的方式更容易(没有概念),所以,这让我想知道:
- 是否有任何使用
std::basic_string<T>
,其中T
不是字符类型的情况?
T
字符串实现且无法使用T
向量(或者使用T
向量将会更加困难)的事情,换句话说:
- 您是否曾经遇到过需要使用
T
字符串的情况?
std::basic_string<int>
有什么不能用std::vector<int>
实现的功能呢?” - PaperBirdMasterstd::basic_string<_uint32>
(并使用为其专门化的std::char_traits
)来存储 UTF32 字符串。在某些地方,我们使用其他字符 traits 来实现诸如忽略大小写比较或通配符搜索之类的操作。 - Revolver_Ocelotbasic_string
保证是连续的,而vector
则不是。 - edmzbasic_string
的连续性保证只在C++11中添加了。 - Barry