"a"
является строковым литералом типа const char[2]
, поэтому он является объектом.
std::string("a")
является выражением prvalue и не является временным объектом (пока).Когда вы вызываете c_str()
, вы материализуете временный объект и вызываете c_str()
для него, получая указатель на данные временного объекта.
Затем вы назначаете адрес указателя на str
, так что теперь str
содержит адрес указателя на данные временного объекта.В конце этого полного выражения материализованный временный объект уничтожается, что делает недействительными итераторы / указатели / ссылки на эти временные данные.
Это означает, что str
теперь указывает на память, которой вы больше не владеете, и называется висящим указателем,Делать с ним что-либо, кроме присвоения ему другого адреса, - неопределенное поведение.
Таким образом, у вас есть 2 объекта, когда все кончено.Висячий указатель (str
) и строковый литерал ("a"
).