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[]、at、begin、rbegin、end 和 rend。
data()/c_str() returns 指向字符串第一个元素的指针。请参阅标准 (N1905),第 13 页。 21.3 [Class 模板基础c_string]:
- 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.
我知道 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[]、at、begin、rbegin、end 和 rend。
data()/c_str() returns 指向字符串第一个元素的指针。请参阅标准 (N1905),第 13 页。 21.3 [Class 模板基础c_string]:
- 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.