Подтвердить что ты не робот

Статическая инициализация локальных переменных

От Скотта Мейерса Эффективный С++:

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

Функция:

FileSystem& tfs()
{ 
    static FileSystem fs;
    return fs; 
}

Но стандарт сказал:

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

Это означает, что мы не можем точно сказать, является ли переменная fs инициализирована или не инициализирована, даже если мы не вызываем функцию tfs(). Поскольку реализации разрешено выполнять раннюю инициализацию, как для переменных со статической продолжительностью хранения.

Кто был прав или что я пропустил?

4b9b3361

Ответ 1

Постоянная инициализация описывает инициализацию, которая может быть определена во время компиляции.

Только в С++ 11 и более поздних версиях может быть рассмотрен тип с нетривиальным конструктором:

если конструктор constexpr

В "Эффективном С++" Мейерс описывает класс в вашем вопросе буквально как:

class FileSystem {...};

Это означало бы, что, учитывая правильность С++-стандарта, "Эффективный С++" также может оставаться верным даже после С++ 11, если предоставленный конструктор для FileSystem не constexpr.