C++11 关于std::basic_字符串的底层存储

C++11 关于std::basic_字符串的底层存储,c++11,memory,stdstring,C++11,Memory,Stdstring,在阅读了CPPFREFERENCE上关于std::basic_string的描述之后,我不确定关于std::basic_string的底层存储的以下两个问题: 1) 自C++11以来,std::basic_string的连续性是否扩展到终止的空字符?请注意,str[str.size()]返回对终止空字符的引用。但是我想确定这是否是在str[str.size()-1]之后 2) 自从C++11以来,data()和C_str()变得等价。但它是否认为data()==c_str()==&front()

在阅读了CPPFREFERENCE上关于
std::basic_string
的描述之后,我不确定关于
std::basic_string
的底层存储的以下两个问题:

1) 自C++11以来,
std::basic_string
的连续性是否扩展到终止的空字符?请注意,
str[str.size()]
返回对终止空字符的引用。但是我想确定这是否是在
str[str.size()-1]
之后

2) 自从C++11以来,
data()
C_str()
变得等价。但它是否认为
data()==c_str()==&front()

本标准的任何报价都将不胜感激

21.4.1.7
basic\u string
accessors

const charT*c_str()const noexcept

const charT*data()const noexcept

1返回:指针
p
,这样
p+i==&运算符[](i)
对于
[0,size()]
中的每个
i

2复杂性:恒定时间

这有效地要求终止的
NUL
与字符序列一起连续存储(它强制
操作符[]
附加要求
s[s.size()]
不要做任何花哨的事情,尽管21.4.5的纯文本似乎给了它一些自由度)


它还明确要求
s.c_str()==&s[0]
,这反过来意味着
s.c_str()===&s.front()
front()
被定义为
操作符[](0)
)。

是和是,都是。是,是。一直困扰我的是[0,s.size())中任意n的
&*(s.begin()+n)==&*s.begin()+n
。但这是迭代器的一个缺陷(
s.begin()+s.size()
是一个特殊的结束迭代器,可以做一些奇特的事情),而不是连续性:)