std :: string真的包装了一个C char数组吗?

App*_*ker 4 c++ string stl

我一直认为a std::string是作为C char数组字符串的STL包装器实现的.但仔细观察设计,我注意到它没有任何提示或标志是一个被包裹的c字符串.对于我所知,我std::string可以在内部做任何事情!

c_str()当然有一种方法我认为它返回了内部char数组,但是如何知道该方法是否不会从它存储的任何数据中创建一个新的 c char数组并返回它?

说真的,如何std::string实施?它(看起来像)只是C char数组的包装器,还是别的?还是两者的混合?甚至可以成为两个有条件的?

Xeo*_*Xeo 12

就我所知,std :: string可以在内部做任何事情!

所知.当然,该标准描述并要求某些语义可以排除任何内容.它在basic_string模板上说明如下:

§21.4 [basic.string] p1

类模板basic_string描述了可以存储由不同数量的任意类似char的对象组成的序列的对象,其中序列的第一个元素位于零.如果它所保持的类似char的对象的类型从上下文中清楚,则这样的序列也称为"字符串".在本条款的其余部分中,对象中保存的类似char的对象的类型basic_stringcharT.

并且"char-like object"由以下文本定义:

§21.1 [strings.general] p1

本条款描述了用于操纵任何非阵列POD(3.9)类型的序列的组件.在本条款中,这些类型称为类似char的类型,类似char的类型的对象称为类似char的对象或简称为字符.

这实际上意味着你可以填充任何你想要的东西basic_string,只要它不是一个数组而且它是一个POD(参见这个这个关于什么POD的信息).然后在角色特征的帮助下操纵这些类似char的对象,角色特征定义它们之间的特定行为和关系.


[...]但我怎么知道该方法是否不会从它存储的任何数据中创建一个新的c char数组并返回它?

在C++ 03中,这对于实现来说是可能的,这是一个已经在C++ 11中得到纠正的已知缺陷:

§2.4.1 [string.require] p5

对象中的char状basic_string对象应连续存储.也就是说,任何basic_string对象s,身份&*(s.begin() + n) == &*s.begin() + n应持的所有值n这样0 <= n < s.size().

另见这些相关问题: