std::string是否真正封装了C char数组?

5
我一直认为 std::string 是一个封装了 C 字符串的 STL 包装器。但是仔细研究后,我发现它并没有给出任何提示或迹象表明它是一个封装的 c-string。就我所知,std::string 内部可能在做任何事情!
当然有 c_str() 方法,我以为它返回内部 char 数组,但是如果这个方法不是从内部存储的数据创建一个新的 c char 数组并返回它,我怎么知道呢?
说真的,std::string 是如何实现的?它(似乎)只是一个 C char 数组的包装器,还是其他东西?或者两者混合使用?甚至可以有条件地变成两者都有?

https://dev59.com/4nM_5IYBdhLWcg3wPAfT - Andrew
1个回答

13
据我所知,std::string 可能在内部执行任何操作!


对于你来说,标准当然描述并要求遵循某些语义,以排除任何可能性。它在 basic_string 模板上说:

§21.4 [basic.string] p1

类模板 basic_string 描述了可以存储由可变数量的任意 char 类对象组成的序列的对象,其中序列的第一个元素位于位置零。如果从上下文中清楚 char 类对象的类型,则称这样的序列为“字符串”。在本条款的其余部分中,将使用 charT 指示 basic_string 对象中保存的 char 类对象的类型。

"char-like object" 的定义如下:

§21.1 [strings.general] p1

这个条款描述了用于操作任何非数组POD(3.9)类型序列的组件。在本条款中,这样的类型被称为“char-like类型”,而char-like类型对象则被称为“char-like对象”或简称“字符”。这意味着您可以将任何想要的内容插入basic_string中,只要它不是数组且是一个POD(请参阅thisthis以获取有关POD的信息)。然后,通过字符特征来操作这些char-like对象,字符特征定义它们之间的具体行为和关系。
"[...] 但是我如何知道该方法是否不会从其内部存储的任何数据创建一个新的c字符数组并将其返回?"
在C++03中,实现确实可以这样做,这是已知的缺陷,在C++11中已经得到了纠正:
“§2.4.1 [string.require] p5”
“basic_string”对象中的char-like对象必须连续存储。也就是说,对于任何“basic_string”对象“s”,对于所有值为“n”的“0 <= n < s.size()”,都应该满足标识“&*(s.begin() + n) == &*s.begin() + n”。
还请参阅以下相关问题:

+1 + 接受。谢谢。希望我能给这个帖子一百个赞。 - ApprenticeHacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接