понедельник, 2 сентября 2013 г.

Вызов конструкторов для статических элементов шаблонного класса

Всем известно, что 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 объекта, то ее отложение на неопределенный срок может быть чревато.

Комментариев нет:

Отправить комментарий