1. На что вам две статических переменных set?
2. Не забудь, переменная статическая и находится в сегменте данных. Так что конструктор Settings() будет выполнен перед запуском main.
3. Функция возвращает ссылку без const. Будут ли меняться настройки? Да — опасно почти гарантированно (структуры данных, потокобезопасные по записи — дело редкое и сложное). Нет — возвращай const Settings& и убедись, что все поля Settings также потокобезопасны по чтению (обычно ответ на этот вопрос да).
4. А initializeDefaults() потокобезопасен? Скорее всего, нет.
> Является ли вызов данной функции потокобезопасным?
Нет однозначного ответа, скорее всего, нет.
> Выполняется ли проверка File()::exists(settingsFilePath) при каждом обращении к функции?
Выполняется.
ЗЫ. Функция вот такого типа точно потокобезопасна — в ней просто нет объектов, за которые можно устраивать гонку.
static inline Settings applicationSettings(){
if (!File::exists(settingsFilePath)){
Settings set(settingsFilePath);
set.initializeDefaults();
return set;
}else{
return Settings(settingsFilePath);
}
}