Это вопрос о разнице между реализациями STL в обработке константной копии std::string
, У меня такой короткий тест, который делает 2 const копии и печатает адреса, возвращенные c_str()
:
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string a("Hello World!");
const string b(a);
const string c(b);
printf("a: %p = %s\n", a.c_str(), a.c_str());
printf("b: %p = %s\n", b.c_str(), b.c_str());
printf("c: %p = %s\n", c.c_str(), c.c_str());
return c.c_str() == b.c_str();
}
На моем gcc 4.6.2 с libstdc ++. So.6.0.16 STL все указатели возвращаются как равные.
Могу ли я положиться на это поведение?
Это портативный или определенный в недавнем стандарте?
Будет ли это работать на текущих или будущих версиях libstdc ++, libc ++, Microsoft STL, stdcxx (apache.org)?
Вы не можете полагаться на это поведение вообще. Единственное, что вам гарантировано в отношении c_str()
является то, что возвращаемый указатель действителен до string
мутирован (определенные методы / функции делают недействительным возвращаемый указатель). У вас нет гарантии, что он будет работать на какой-либо конкретной архитектуре или компиляторе и не должен полагаться на такое поведение.
Это то, что известно как COW (Копировать при записи) семантика. Это стратегия оптимизации, позволяющая избежать ненужного копирования строк. Но вы не можете полагаться на это поведение — это деталь реализации GNU libstdc ++. На самом деле это не так разрешено стандартом C ++ 11.