Поправьте если не прав.
Из временной строки конструируется временный std::string, ссылка на который передается в конструктор. По ходу дела ссылка в объекте становится невалидной из-за разрушения временного std::string, и мы имеем ошибку доступа.
Если все так вопросы следующие. Где заканчивается полное выражение для временной строки? В этом случае не работает расширение жизни объекта на который ссылается константная ссылка (работает но ссылка умирает по дороге)? Где доходчиво можно прочитать про временные объекты и их время жизни?
1M>Если все так вопросы следующие. Где заканчивается полное выражение для временной строки? В этом случае не работает расширение жизни объекта на который ссылается константная ссылка (работает но ссылка умирает по дороге)? Где доходчиво можно прочитать про временные объекты и их время жизни?
возвращаемый объект этой функции не константный, видимо умирает именно он, а не указатель на строку.
попробуй так
Если ты где-то прочитал что const ссылка продлевает время жизни объекта, то это совсем не тот случай. const ссылка будет оставаться валидной только при возврате объекта из функции по значению.
1M>Поправьте если не прав. 1M>Из временной строки конструируется временный std::string, ссылка на который передается в конструктор. По ходу дела ссылка в объекте становится невалидной из-за разрушения временного std::string, и мы имеем ошибку доступа.
1M>Если все так вопросы следующие. Где заканчивается полное выражение для временной строки? В этом случае не работает расширение жизни объекта на который ссылается константная ссылка (работает но ссылка умирает по дороге)? Где доходчиво можно прочитать про временные объекты и их время жизни?
У вас ошибка в структуре test. Конструктор принимает временный объект в аргумент, время жизни которого продлевается до конца жизни аргумента, и при выходе из конструктора поле s ссылается на уже разрушенный объект. Константная ссылка не продлевает время жизни другой константной ссылки.
Здравствуйте, 10000.monkeys, Вы писали:
1M>Код ниже продуцирует ошибку доступа в дебаге.
А самое прикольное, что asan не ловит эту ошибку. Чтобы он начал её ловить, надо длину увеличить строки (поставить например "TEST66666666666666666" вместо "TEST"). Похоже что такое поведение связано со small string optimization.
1M> Где заканчивается полное выражение для временной строки?
Это выражение под оператором return в функции construct.
1M> В этом случае не работает расширение жизни объекта на который ссылается константная ссылка (работает но ссылка умирает по дороге)?
В этом случае не работает, потому что ссылка — нестатический член класса и при данном способе инициализации этой ссылки продление времени жизни не выполняется.
1M> Где доходчиво можно прочитать про временные объекты и их время жизни?