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

Ben*_*enj 78 c++ stl

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

CB *_*ley 57

std::basic_string是一个用于从字符类型中创建字符串的类模板,std::stringtypedef用于该类模板的特化char.是的,它们都是需要的(或者至少是标准要求的).

  • 为什么他们都需要? (14认同)
  • @MuhammadAnnaqeeb 晚了 2.5 年,但简短的回答是提供宽字符串 (wstring)(Unicode,每个字符 2 个字节,wchar_t)支持。 (5认同)
  • 所以你是说 std::string 是 typedef std::basic_string<char> std::string ? (2认同)

pmr*_*pmr 37

std::string是一个实例std::basic_string<T>:

typedef std::basic_string<char> string
Run Code Online (Sandbox Code Playgroud)

std::basic_string必须为所有类型的字符串(wstring例如)提供类似的接口.

  • 适当的术语是"专业化".`string`是`basic_string`的*specialization*. (28认同)
  • 将派生类称为"专业化"是对"专业化"的较不正式的使用.标准中没有使用"专业化"这个词(我很相当),但它广泛用于描述模板专业化.模板特化的名称可以在不强制和隐式实例化的上下文中使用,因此特化和实例化是单独的概念.除了模板特化(具有特定参数集的模板的名称)之外,还有部分特化(仅限类模板)和显式特化. (5认同)
  • @Charles:它具有误导性,因为(使用模板),"specialization"通常指的是部分特化或显式特化,*not*typedef最终将作为简单的实例化. (3认同)
  • 我想你可以为此争论。“专业化”通常用于表示继承。模板化的{class | function}通过替换模板参数来实例化。有部分模板专门化,但此处未使用。 (2认同)
  • 在这里使用“专业化”会产生误导。模板特化具有特定含义(与继承无关),但这不是此处使用的含义。std::string 只不过是一个 typedef,例如: `namespace std { typedef basic_string&lt;char&gt; string; 从技术上讲,它也不是真正的实例化,但它至少更接近(根据定义,实例化创建一个实例,而 typedef 仅创建一个名称,而不是一个实例)。 (2认同)
  • @Jerry Coffin:`std::string` 是一个`typedef` _for_ 模板的专门化。“专业化”的使用如何产生误导? (2认同)
  • @Jerry Coffin:我同意专业化并不指 typedef,但专业化用于应用于任何模板专业化,无论是否明确专业化。这是专业化的一种非常常见且正确的用法。我不明白使用“专业化”来引用 `basic_string&lt;char&gt;` 有什么不寻常或误导性。 (2认同)

Zan*_*son 15

A std::stringstd::basic_string模板的实例化,其类型为char.你需要两者,这样你就可以制作一些东西char,比如std::basic_string<wchar_t>一串宽字符.或者如果你想要一个32位元素的字符串,std::basic_string<unsigned int>.

  • 我认为这应该是得票最高的答案。它提供了一个用例,即在没有“char”类型的情况下,您不会实例化“std::basic_string”。 (3认同)