Всем известно, что static элементы класса создаются как нелокальные переменные:
9.4.1.6
Static data members are initialized and destroyed exactly like non-local variables (3.6.2, 3.6.3).
но при работе со static элементами шаблонного класса все не так очевидно.
- Вызов конструктора для
статического элемента шаблонного класса
происходит только при первом явном обращении к такому элементу (простого инстанцирования класса недостаточно).
struct Static
{
Static(){
cout << "Static\n"; }
};
template<typename T>
struct StaticConstructTemp
{
static Static m_static;
void init()
{
m_static;
}
};
template<typename T>
Static StaticConstructTemp<T>::m_static;
int main()
{
StaticConstructTemp<int> test; // Инстанцирование класса не приводит к вызову конструкторов static элементов-объектов.
test.init(); // Конструктор вызывается только тут.
return 0;
}
- Вызов конструктора для
статического элемента не шаблонного
класса происходит до первого обращения к нему (в момент запуска программы) по обычным правилам.
struct Static
{
Static(){
cout << "Static\n"; }
};
struct StaticConstruct
{
static Static m_static;
void init()
{
m_static;
}
};
Static StaticConstruct::m_static;
//Обращение не требуется, конструктор вызывается.
В принципе, это нельзя назвать проблемой, но если требуется выполнять некоторую инициализацию, зависящую от создания данного static объекта, то ее отложение на неопределенный срок может быть чревато.