c_str 总是 Return 同一个地址吗?

Does c_str Always Return the Same Address?

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

在 C++11 之前,对 string::c_str 的调用将 return 和 const char* 但保证是同一个。例如,给定 string foo,这是否保证是真实的,或者它们可能 return 不同的地址?

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

编辑: 我应该补充说,只要不调用任何方法,string::c_str 的 return 是否始终保持一致在 foo 上,这会使它的迭代器失效。

Edit:阅读标准中的同一段,我现在得出结论,允许对方法 data()/c_str() 的后续调用使先前的无效返回指针(即使你没有做任何其他事情),所以你的问题的答案将是,多么讽刺。

原回答:

可以,只要您对对象执行的非常量操作只有 operator[]atbeginrbeginendrend

data()/c_str() returns 指向字符串第一个元素的指针。请参阅标准 (N1905),第 13 页。 21.3 [Class 模板基础c_string]:

  1. References, pointers, and iterators referring to the elements of a basic_string sequence may be invalidated by the following uses of that basic_string object:

— As an argument to non-member functions swap() (21.3.7.8), operator>>() (21.3.7.9), and getline() (21.3.7.9).

— As an argument to basic_string::swap().

— Calling data() and c_str() member functions.

— Calling non-const member functions, except operator[], at, begin, rbegin, end, and rend.

— Following construction or any of the above uses, except the forms of insert and erase that return iterators, the first call to non-const member functions operator[], at, begin, rbegin, end, or rend.