Вопрос по c++, templates – Почему статические поля шаблона не инициализируются, если не используются? [Дубликат]

6

Possible Duplicate:
(static initialization/template instantiation) problems with factory pattern
trying to force static object initialization

EDIT: There is a duplicate of this but I'll leave this up as I personally had trouble finding it. In addition here's the answer that helped me:

https://stackoverflow.com/a/2852234/673730

Предположим, следующий класс:

<code>template<class X>
struct A
{
   static bool x;
   static bool foo()
   {
      cout << "here";
      return true;
   }
};

template<class X>
bool A<X>::x = A<X>::foo();
</code>

Я бы предположил, что, когда я специализируюсьAстатическое полеx будет инициализирован. Тем не менее, следующее:

<code>A<int> a;
//no output
</code>

не приводит к вызовуfoo, Если я пытаюсь получить доступ к члену, поведение будет таким, как ожидалось:

<code>A<int> a;
bool b = a.x;
//output: here
</code>

РЕДАКТИРОВАТЬ:How can I make sure A::x is initialized without accessing it?

Ваш Ответ

2   ответа
12

implicitly специализируемый в силу того, что его конкретизируют, тогда создаются только те члены, на которые фактически ссылаются.

Сравните это сexplicit создание шаблона класса (template struct A<int>;), который создает и создает код дляall члены. (Вы также можете создавать экземпляры только отдельных участников по отдельности:template bool A<int>::x;.)

1

Если элемент шаблона класса или шаблон элемента не был явно создан или явно специализирован, специализация члена создается неявно, когда на специализацию ссылаются в контексте, который требует определения элемента; в частности, инициализация (и любые связанные побочные эффекты) элемента статических данных не происходит, если только сам элемент статических данных не используется таким образом, который требует определения элемента статических данных.

template<class X, bool y>
struct A
{
    static cosnt bool x = y;
    static bool foo()
    {
       cout << "here";
       return true;
    }
 };

Похожие вопросы