инициализация статического объекта при связывании с статической библиотекой

Каковы правила инициализации статического объекта, объявленного в другой общей библиотеке? Например, рассмотрим следующее:

Файл X.HPP:

struct X {
   X ();
   static X const s_x;
};

struct Y {
   Y (X const &) {}
};

Файл X.cpp:

#include "X.hpp"
#include <iostream>

X::X ()
{
   std::cout << "side effect";
}

X const X::s_x;

Я составил X.cpp в статической библиотеке libx.a , и я пытался связать Следующий исполняемый файл против него (файл main.cpp):

#include "X.hpp"

int main ()
{
     (void)X::s_x;  // (1)
     X x = s_x;     // (2)
     Y y = s_x;     // (3)
 }

только с (1) или (2), ничего не происходит. Но если я добавляю (3), статический объект инициализирован (то есть побочный эффект »напечатан). (Я использую GCC 4.6.1).

Есть ли способ предсказать, что здесь произойдет?

Я не понимаю, как инструкция (2) не заставляет объект x :: S_x , чтобы быть построенным по умолчанию, тогда как (3) делает.

Редактировать: сборки команд:

g++ -c X.cpp
g++ -c main.cpp
ar rcs libX.a X.o
g++ -o test main.o -L. -lX
7
задан Nicolas Grebille 9 September 2011 в 08:52
поделиться