Каковы правила инициализации статического объекта, объявленного в другой общей библиотеке? Например, рассмотрим следующее:
файл 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