Да. При первом вызове foo()
будет построено Bar bar
. Затем он будет доступен до тех пор, пока не закончится main()
, после чего он будет уничтожен.
Это по сути:
static Bar *bar = 0;
if (!bar)
{
bar = new Bar;
// not "real", of course
void delete_bar(void) { delete bar; }
atexit(delete_bar);
}
Заметьте, я сказал "по существу"; это, вероятно, не то, что на самом деле происходит (хотя я не думаю, что это слишком далеко).
3.7.1 Статическая продолжительность хранения
1 Все объекты, которые не имеют ни динамической длительности хранения, ни являются локальными, имеют статическую длительность хранения. Хранение этих объектов должно продолжаться в течение всей программы (3.6.2, 3.6.3).