Никаких гарантий.
[string.cons]/36
определяет присвоение const char*
для std::string
в терминах перемещения-назначения, определение которого:
basic_string& operator=(basic_string&& str) noexcept(/*...*/)
Эффекты : перемещение назначает как контейнер последовательности, за исключением того, что итераторы, указатели и ссылки могут быть недействительными.
Это показывает, что Комитет позволил реализации свободно выбирать между недействительной операцией и более консервативной.И чтобы сделать вещи еще яснее:
Ссылки, указатели и итераторы, ссылающиеся на элементы последовательности basic_string
, могут быть признаны недействительнымиследующим использованием этого объекта basic_string:
- (4.1) в качестве аргумента любой стандартной библиотечной функции, принимающей ссылку на неконстантный
basic_string
в качестве аргумента. - (4.2) Вызов неконстантных функций-членов, кроме
operator[]
, at
, data
, front
, back
, begin
, rbegin
, end
и rend
.
Я спрашиваю, потому что я полагаюсь на это, чтобы избежать фрагментации кучи.
std::string
принимает в качестве параметра-шаблона распределитель.Если вы действительно обеспокоены возможной фрагментацией кучи, вы можете написать свою собственную, которая с некоторыми эвристиками может иметь стратегию распределения, подходящую для ваших нужд.
На практике большинство известных мне реализаций не перераспределяют памятьв случае вашего вопроса.Это можно проверить, протестировав и / или проверив документацию по реализации и, в конечном итоге, исходный код.