В одном и том же модуле компиляции стандарт C++ говорит, что статический порядок инициализации хорошо определен - это порядок объявлений статических объектов. Но используя компилятор Sun Studio 12, я сталкиваюсь с неинтуитивным поведением. Я определил шаблонный класс helper<T>
, который содержит статический член _data
типа T
и статическую функцию-член, которая использует _data
по номеру foo
. В моем файле .cpp я это выше основного():Выполняет ли typedefs шаблонов статический порядок инициализации?
struct A { /* some definition */ };
typedef helper<int> s0;
typedef helper<A> s1;
Обрати внимание, что для ЬурейиХ helper<int>
приходит перед в ЬурейеМ для helper<A>
. Таким образом, согласно стандарту, я бы ожидал, что helper<int>::_data
будет построен до helper<A>::_data
(помните, что _data
является статическим членом). На GCC это так, на Солнце это не так.
Это проблематично, поскольку конструктор A использует helper<int>::_data
. У меня есть только одна единица компиляции, с более ранним потенциальным экземпляром helper<A>
, поэтому я думал, что порядок должен быть четко определен. Является ли это ошибкой компилятора Sun, или же typedef не является технически определением/конкретизацией? Я имею в виду, является ли поведение компилятора Sun допустимым стандартом?
У меня есть следующие основные():
int main()
{
//Swapping the order of these has no effect on Sun
s0::foo();
s1::foo();
}
Там нет других видов использования s0 или s1.
Спасибо за тщательный, информативный ответ. –
К сожалению, если ваш ответ верен, и я правильно вас понимаю, то я думаю, что компилятор Sun по-прежнему не прав. В коде, следующем за исходным фрагментом, s1 :: something_using_the_static_member использовался до s0 :: something_using_the_static_member. Я переключил порядок, но Sun по-прежнему создает статический член s1 перед s0. Правильно ли я считаю? –
См. Мое редактирование оригинального сообщения –