c_str总是返回相同的地址吗?

Does c_str Always Return the Same Address?

本文关键字:地址 返回 str      更新时间:2023-10-16

我知道c++ 11对string做了相当多的更改。其中最重要的是需要在内存中线性布局。

在c++ 11之前,对string::c_str的调用将返回一个const char*,但它保证是相同的吗?例如,给定string foo,这是否保证为真,或者它们可能返回不同的地址?

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

EDIT:我应该补充说,我在问string::c_str的返回是否总是一致的,只要没有在foo上调用方法,这将使其迭代器无效。

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

原始回答:

可以,只要在对象上执行的非const操作只有operator[]atbeginrbeginendrend

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

  • 指向basic_string序列元素的引用、指针和迭代器可能被basic_string对象的以下用法:
  • -作为非成员函数swap()(21.3.7.8)、operator>>(21.3.7.9)和getline(21.3.7.9)的实参。

    -作为basic_string::swap()的参数。

    -调用data()和c_str()成员函数

    —调用非const成员函数,除了操作符[]、at、begin、rbegin、end和rend

    -在构造函数或上述任何一种用法之后,除返回迭代器的insert和erase形式外,对非const成员函数operator[]、at、begin、rbegin、end或rend的第一次调用