Время жизни временной привязки к агрегированному инициализированному элементу структуры - PullRequest
12 голосов
/ 19 апреля 2011

С учетом следующего кода:

class foo
{
};

class bar: public foo
{
public: 
    ~bar() { printf("~bar()\n"); }
};

class zab: public foo
{
public: 
    ~zab() { printf("~zab()\n"); }
};

struct foo_holder
{
    const foo &f;
};

int main()
{
    foo_holder holder[]= { {bar()}, {zab()} };
    printf("done!\n");
    return 0;
}

вывод:

~bar()
~zab()
done!

В C ++ 0x есть пункт, который предписывает, что это может создавать висячие ссылки при использовании в качестве нового инициализатора, но он ничего не говорит (по крайней мере, ничего, что я могу найти) о совокупной инициализации константных ссылок с временными.

Это неуказанное поведение тогда?

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Я получил ответ на comp.std.c ++:

http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b

По сути, стандарт не предусматривает этого явно; следовательно, он должен вести себя так же, как ссылка, объявленная локально.

1 голос
/ 20 апреля 2011

Не упоминается в списке исключений, поэтому время жизни до временного должно быть увеличено, чтобы соответствовать времени жизни (массива) foo_holder с.Однако для меня это выглядит упущением, возможно, хорошей идеей может быть отправка отчета о дефектах.


§12.2 / 5 гласит, что, когда ссылка связана с временным, время жизни временного расширения увеличивается до совпадения.время жизни ссылки и поскольку const foo& f является членом foo_holder, время жизни ссылки соответствует времени жизни foo_holder, в соответствии с §3.7.5 / 1:

Продолжительность храненияподобъектов-членов, подобъектов базового класса и элементов массива - это их завершенный объект (1.8).

Это может быть немного сложно интерпретировать с учетом ссылок, поскольку §3.8 / 1 утверждает, что время жизниобъект заканчивается, когда память освобождается или используется повторно:

Время жизни объекта типа T заканчивается, когда:

- если T является типом класса с нетривиальным деструктором (12.4), начинается вызов деструктора, или

- хранилище, которое занимает объект, используется повторно или освобождается.

однако оно не определеноиспользуют ли ссылки хранение или нет;§8.3.2 / 4 гласит:

Не определено, требует ли ссылка хранения (3.7).

Возможно, кто-то с лучшим знанием стандарта узнает это лучше.

...