От Скотта Мейерса Эффективный С++:
если вы никогда не вызываете функцию, эмулирующую нелокальный статический объект, вы никогда не несут затраты на строительство и разрушение объекта, то, что нельзя сказать для истинных нелокальных статических объектов.
Функция:
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}
Но стандарт сказал:
Постоянная инициализация (3.6.2) объекта с областью действия блока со статическим длительность хранения, если это применимо, выполняется до того, как ее блок сначала вошел. Реализация разрешена для раннего инициализация других переменных области блока со статикой или потоком хранения при тех же условиях, что реализация разрешено статически инициализировать переменную со статикой или потоком время хранения в области пространства имен (3.6.2).
Это означает, что мы не можем точно сказать, является ли переменная fs
инициализирована или не инициализирована, даже если мы не вызываем функцию tfs()
. Поскольку реализации разрешено выполнять раннюю инициализацию, как для переменных со статической продолжительностью хранения.
Кто был прав или что я пропустил?