Вы должны либо убедиться, что file1.cpp
включает <iostream>
до определения sgObj
, либо вам необходимо создать локальный объект типа std::ios_base::Init
, прежде чем использовать cout
во время инициализации stati c:
if(initVal < getInitValue())
{
(void)std::ios_base::Init{};
cout << "Print some log message" << endl;
}
В противном случае cout
может не инициализироваться при достижении этой линии.
Кроме этого, порядок, в котором строятся Y::sObj
и глобальный sgObj
является неопределенным, при условии, что Y::sObj
определено в другой не показанной единице перевода, потому что порядок, в котором происходит инициализация динамической c между различными единицами перевода, является неопределенным.
Следовательно, если Y::initMethod
, который называется из глобальной инициализации sgObj
доступ Y::sObj
может быть еще не инициализирован, вызывая неопределенное поведение.
Если вы хотите иметь возможность использовать stati c Y::sObj
во время stati c для инициализации других нелокальных переменных stati c вам нужно использовать что-то вроде одноэлементного шаблона Мейерса:
class Y{
//...
static Y& sObj {
static Y instance /* initializer here */;
return instance;
}
};
Для использования в качестве * 102 7 * вместо Y::sObj
.