std :: string和std :: basic_string之间有什么区别?为何两者都需要?


94

std::string和之间有什么区别std::basic_string?为什么都需要?

Answers:


63

std::basic_string是用于使用字符类型制作字符串的类模板,std::stringtypedef用于的该类模板的专门化char。是的,它们都是必需的(或者至少是标准要求的)。


17
为什么都需要它们?
Mohamed El-Nakib'2

1
所以你说的是std :: string是typedef std :: basic_string <char> std :: string?
unresolved_external 2015年

1
@MuhammadAnnaqeeb晚了2.5年,但简短的答案是也提供宽字符串(wstring)(Unicode,每个字符2个字节,wchar_t)支持。
安德鲁

46

std::string是的实例化std::basic_string<T>

typedef std::basic_string<char> string

std::basic_string对于所有类型的字符串都必须具有相似的接口(wstring例如)。


33
合适的术语是“专业化”。string专业化basic_string
AnT

3
我想你可以为此争论。“专业化”通常用于表示继承。模板化的{class | function}通过替换模板参数来实例化。有部分模板专门化,但此处未使用。
09年

5
将派生类称为“专业化”是对“专业化”的非正式使用。“专业化”一词在标准中根本没有这样使用(我很确定),但是它广泛用于描述模板专业化。模板专门化的名称可以在不强制使用和隐式实例化的上下文中使用,因此专门化和实例化是单独的概念。除了模板专业化(带有特定参数集的模板的名称)之外,还存在部分专业化(仅适用于类模板)和显式专业化。
CB Bailey

1
在这里使用“专业化”会产生误导。模板专业化具有特定的含义(与继承无关),但这不是这里使用的含义。std :: string几乎不比typedef多,例如:namespace std { typedef basic_string<char> string; }从技术上讲,它实际上也不是实例化,但至少更接近(实例化,根据定义,创建实例,而typedef仅创建名称,而不是实例)。
杰里·科芬,2009年

3
@Charles:这具有误导性,因为(使用模板)“专业化”通常是指部分专业化或显式专业化,而不是类型定义,其最终结果将是简单的实例化。
杰里·科芬,2009年

17

Astd::stringstd::basic_string类型为的模板的实例char。两者都需要,以便可以制作除以外的其他字符串char,例如std::basic_string<wchar_t>用于一串宽字符。或者,如果您想要一个包含32位元素的字符串,请输入std::basic_string<unsigned int>


2
我认为这应该是票数最高的答案。它提供了一个用例,当您std::basic_string没有char类型时就无法实例化。
hlin117
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.