Срок хранения временных и CWG процедуры - PullRequest
7 голосов
/ 08 октября 2019

Стандарты C ++ не определяют срок хранения временных объектов. Это тема CWG, выпуск 1634 .

. В соответствии с сайтом, на который ведут ссылки, статус этого вопроса "drafting" , , что означает :

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

Однако, нет четкого упоминания о консенсусе / решении по этому конкретному вопросу, и я также не смог найти его где-либо еще на сайте комитета.

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

В частности, мне не ясно,временный объект, созданный в операторе в области блока, будет иметь (автоматически?) продолжительность хранения, продолжающуюся до конца блока, подобно автоматической переменной declared в той же точке, или время его хранения заканчивается его (по умолчанию) временем жизни в конце полного выражения. Описание проблемы намекает на последний случай.

Должно ли описание содержать « Предварительное решение », и если да, то правильно я истолковал или нет, могу ли я найти" Предварительное решение " этой проблемы где-то еще?

Кроме того, в настоящее время основные компиляторы следуют этому консенсусу, либо документально, либо де-факто?

См. Также старые вопросы:


Редактировать для уточнения:

Я не спрашиваю о времени жизни временного объектаЭто хорошо указано в стандарте. Я спрашиваю о продолжительности хранения. Например:

#include<new>

struct A {
    operator A*() {
        return this;
    }

    int i = 0;

    // Some other stuff (and non-trivial destructor)
};

A* ptr1 = A();
A* ptr1_new = new(ptr1) A();

// Use new object through ptr1_new

A* ptr2 = A();

int main() {
    A* ptr2_new = new(ptr2) A();

    A* ptr3 = A();
    A* ptr3_new = new(ptr3) A();

    // Use new objects through ptr2_new and ptr3_new
}

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

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

...