Ответ 1
Я получил ответ на comp.std.С++:
http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b
В принципе, стандарт явно не обращается к нему; поэтому он должен вести себя так же, как ссылка, объявленная локально.
С учетом следующего кода:
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!
С++ 0x имеет предложение, которое диктует, что он может создавать оборванные ссылки при использовании в качестве нового инициализатора, но он ничего не говорит (по крайней мере, ничего не могу найти) об инициализации совокупности ссылок const со временными.
Это неуказанное поведение?
Я получил ответ на comp.std.С++:
http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b
В принципе, стандарт явно не обращается к нему; поэтому он должен вести себя так же, как ссылка, объявленная локально.
Он не упоминается в списке исключений, поэтому время жизни до временного должно быть расширено, чтобы соответствовать времени жизни (array of) foo_holder
s. Однако это выглядит как недосмотр, возможно, представление отчета о дефектах может быть хорошей идеей.
В §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).
Возможно, кто-то, кто лучше знает стандарт, будет знать это лучше.