Сколько временных объектов создается в этой инициализации? - PullRequest
1 голос
/ 26 апреля 2019

У меня есть эта инициализация:

const char* str = std::string("a").c_str();

Сколько временных объектов создано в этой инициализации?

Может ли "a" считаться временным. объект

Я знаю, std::string("a") это темп. объект.

Результатом c_str() является объект, str сохраняет его. Так что это не темп. объект, верно?

Ответы [ 3 ]

6 голосов
/ 26 апреля 2019

"a" является строковым литералом типа const char[2], поэтому он является объектом.

std::string("a") является выражением prvalue и не является временным объектом (пока).Когда вы вызываете c_str(), вы материализуете временный объект и вызываете c_str() для него, получая указатель на данные временного объекта.

Затем вы назначаете адрес указателя на str, так что теперь str содержит адрес указателя на данные временного объекта.В конце этого полного выражения материализованный временный объект уничтожается, что делает недействительными итераторы / указатели / ссылки на эти временные данные.

Это означает, что str теперь указывает на память, которой вы больше не владеете, и называется висящим указателем,Делать с ним что-либо, кроме присвоения ему другого адреса, - неопределенное поведение.

Таким образом, у вас есть 2 объекта, когда все кончено.Висячий указатель (str) и строковый литерал ("a").

0 голосов
/ 03 июля 2019

Может ли "a" считаться временным. объект

Технически, это не очень хорошо определено .

У нет определенного времени жизни. Технически его использование не имеет определенное поведение. Это не конструкции, которая официально начинает жизнь объекта.

На практике вы можете использовать его (очевидно).

0 голосов
/ 26 апреля 2019

Есть только один. Строка.

"a" - это литерал, тип которого равен const char[] соответствующего размера, он имеет статическое хранилище. Так что это точно не временно.

str, а возвращаемое значение c_str() - это также const char указатели.

Другие объекты не создаются.

...