Когда в C ++ вызываются конструкторы статических членов шаблонных классов?

Существует много информации о том, когда вызываются конструкторы статических членов обычных классов. Однако я наблюдаю странное поведение в отношении классов шаблонов.

Каким должен быть результат следующей программы? (Заметьте, я использую printf, чтобы избежать каких-либо осложнений, связанных с фиаско статической инициализации с std :: cout.)

#include <iostream>

class B {
public:
  B(const std::string &s) { printf("Hello I am B from %s\n", s.c_str()); }
};

template<typename T>
class Atempl {
public:
  static B b_;
};

class A {
public:
  static B b_;
};

template<typename T>
B Atempl<T>::b_("Atempl");
B A::b_("A");

class C : public Atempl<int> {
};

int main(int argc, const char *argv[]) {
  return 0;
}

Я думаю, что результат должен быть:

Hello I am B from A
Hello I am B from Atempl

Но с g ++ 4.3 на FreeBSD 7.3 я получаю:

Hello I am B from A

Если я добавлю строка

template class Atempl<int>;

все хорошо, и я получаю ожидаемый результат. Вопрос в том, почему объявление класса C не считается экземпляром шаблона. Атемпл и вызвать конструктор B? Это часть стандарта или ошибка в g ++ 4.3?

9
задан Manish 5 August 2011 в 16:38
поделиться