C ++ STL: будет ли изменено c_str () при создании const-копии std :: string?

Это вопрос о разнице между реализациями 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)?

2

Решение

Вы не можете полагаться на это поведение вообще. Единственное, что вам гарантировано в отношении c_str() является то, что возвращаемый указатель действителен до string мутирован (определенные методы / функции делают недействительным возвращаемый указатель). У вас нет гарантии, что он будет работать на какой-либо конкретной архитектуре или компиляторе и не должен полагаться на такое поведение.

3

Другие решения

Это то, что известно как COW (Копировать при записи) семантика. Это стратегия оптимизации, позволяющая избежать ненужного копирования строк. Но вы не можете полагаться на это поведение — это деталь реализации GNU libstdc ++. На самом деле это не так разрешено стандартом C ++ 11.

10

По вопросам рекламы [email protected]