我知道C ++ 11对string
做了很多修改。其中最重要的是要求它在内存中线性排列。
在C ++ 11之前,对string::c_str
的调用将返回const char*
,但保证是相同的。{1}}。例如,给定string foo
,这是保证为真,还是可能返回不同的地址?
foo.c_str() == foo.c_str()
编辑:我应该追加,只要在string::c_str
上没有调用任何方法,我就会询问foo
的返回是否始终一致会使其迭代器失效。
答案 0 :(得分:3)
编辑:从标准中读取相同的段落,我现在得出结论,允许对方法data()/ c_str()的后续调用使先前返回的指针无效(即使你没有做了其他事情),所以你的问题的答案是不,多么具有讽刺意味。
原始答案:
是的,只要您对该对象执行的唯一非常规操作是 operator [] , ,开始,< strong> rbegin ,结束,结束。
data()/ c_str()返回指向字符串第一个元素的指针。参见标准(N1905),p。 21.3 [类模板basic_string]:
- 引用basic_string序列元素的引用,指针和迭代器可能会被无效 以下使用该basic_string对象:
醇>- 作为非成员函数swap()(21.3.7.8),运算符&gt;&gt;()(21.3.7.9)和getline()(21.3.7.9)的参数。
- 作为basic_string :: swap()的参数。
- 调用data()和c_str()成员函数。
- 调用非const成员函数,除了 operator [],at,begin,rbegin,end和rend 。
- 在构造或任何上述用法之后,除了返回迭代器的insert和erase形式之外,第一次调用非const成员函数operator [],at,begin,rbegin,end或rend。