Ответ 1
Является ли стандарт гарантией стабильности адреса значения?
С моей точки зрения, неуказано, стабилен ли адрес или нет.
Формально стандарт только гарантирует отсутствие динамических распределений для объекта, содержащегося в std::optional
и содержащий объект хранится как часть std::optional
:
23.6.3. Шаблон класса необязательный [optional.optional]
Любой экземпляр необязательного в любой момент времени либо содержит значение, либо не содержит значения. Когда экземпляр необязательного значения содержит значение, это означает, что объект типа T, называемый необязательным объектом, содержащим значение, выделяется в хранилище необязательного объекта. Реализациям не разрешено использовать дополнительное хранилище, такое как динамическая память, для распределения его содержащегося значения. Содержащееся значение должно быть выделено в области дополнительного хранилища, подходящим образом выровненного для типа T. Когда объект типа необязательный преобразуется контекстом в bool, преобразование возвращает true, если объект содержит значение; в противном случае преобразование возвращает false.
Фактический механизм хранения определяется конкретной реализацией, поэтому потенциальный адрес может измениться.
На практике, однако, реализация будет использовать что - то вроде aligned_storage
(см увеличить реализацию) или union
(как GCC делает) и сохранить адрес объекта, содержащего то же самое.