c_str是否始终返回相同的地址?

时间:2016-08-18 16:35:34

标签: c++ string c-strings c++03

我知道C ++ 11对string做了很多修改。其中最重要的是要求它在内存中线性排列。

在C ++ 11之前,对string::c_str的调用将返回const char*,但保证是相同的。{1}}。例如,给定string foo,这是保证为真,还是可能返回不同的地址?

foo.c_str() == foo.c_str()

编辑:我应该追加,只要在string::c_str上没有调用任何方法,我就会询问foo的返回是否始终一致会使其迭代器失效。

1 个答案:

答案 0 :(得分:3)

编辑:从标准中读取相同的段落,我现在得出结论,允许对方法data()/ c_str()的后续调用使先前返回的指针无效(即使你没有做了其他事情),所以你的问题的答案是,多么具有讽刺意味。

原始答案:

是的,只要您对该对象执行的唯一非常规操作是 operator [] 开始,< strong> rbegin ,结束结束

data()/ c_str()返回指向字符串第一个元素的指针。参见标准(N1905),p。 21.3 [类模板basic_string]:

  
      
  1. 引用basic_string序列元素的引用,指针和迭代器可能会被无效   以下使用该basic_string对象:
  2.         

    - 作为非成员函数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。