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