Подтвердить что ты не робот

Что такое временный объект со статической продолжительностью хранения

Вдохновленный этот ответ, [expr.const]

Постоянным выражением является либо выражение константы ядра glvalue, которое относится к сущности, которая является допустимым результатом константного выражения (как определено ниже), или константным выражением основного значения prvalue, значение которого удовлетворяет следующим ограничениям:

  • если значение является объектом типа класса, каждый нестатический элемент данных ссылочного типа относится к объекту, который является допустимым результатом постоянного выражения,

  • если значение имеет тип указателя, оно содержит адрес объекта со статической продолжительностью хранения, адрес за концом такого объекта ([expr.add]), адрес функции или значение нулевого указателя и

  • если это значение является объектом класса или типа массива, каждый подобъект удовлетворяет этим ограничениям для значения.

Сущность является допустимым результатом выражения константы, если она является объектом со статической продолжительностью хранения, которая либо не является временным объектом, либо является временным объектом, значение которого удовлетворяет вышеуказанным ограничениям, или оно является функцией.

Что такое временный объект со статическим временем хранения? Я что-то упускаю или это парадоксально для того, чтобы объект был временным и имел статическую продолжительность хранения?

Определение [basic.stc.static]

Все переменные, которые не имеют динамической продолжительности хранения, не имеют продолжительности хранения потоков и не являются локальными, имеют статическую продолжительность хранения. Хранилище для этих объектов должно длиться в течение всего времени программы

Используется только для переменных.

4b9b3361

Ответ 1

[basic.stc]/1 сообщает нам:

Длительность хранения - это свойство объекта, определяющего минимальное потенциальное время жизни хранилища, содержащего объект.

Таким образом, каждый объект имеет продолжительность хранения. Далее, в пункте 2 говорится:

Статические, потоковые и автоматические периоды хранения связаны с объектами, введенными объявлениями (6.1) и , неявно создаваемыми реализацией (15.2).

Добавлен акцент. Обратите внимание, что раздел 15.2 - [class.temporary]: правила для временных объектов.

Поэтому мы можем заключить, что временные объекты имеют длительность хранения. И мы можем заключить, что временные данные должны иметь одну из этих времен хранения. Действительно, в стандарте есть множество ссылок на "переменные или временные объекты" и их длительности хранения.

Однако, несмотря на то, что это ясно говорит о том, что временные объекты имеют одну из этих длительностей хранения... стандарт никогда не говорит о том, какая у них продолжительность хранения. [class.temporary] не имеет утверждения о том, что временные привязки к ссылкам имеют длительность хранения их ссылок. И [basic.stc] объяснение статических, автоматических и поточно-локальных длительностей всегда говорит о переменных.

Поэтому я бы сказал, что это недостаток в формулировке. Кажется очевидным, что стандарт ожидает, что временные ресурсы будут иметь соответствующую продолжительность хранения; есть несколько мест, где стандарт говорит о длительности хранения переменных или временных объектов. Но он никогда не говорит о том, какой срок хранения у них на самом деле.