В стандарте языка С++ указано следующее относительно компонентов шаблона в стандартной библиотеке:
Эффекты undefined... если неполный тип используется в качестве аргумента шаблона при создании экземпляра компонента шаблона, если это специально не разрешено для этого компонента (С++ 11 §17.6.4.8/2).
Является ли следующее создание экземпляра шаблона класса std::vector
?
class X;
std::vector<X> f(); // Declaration only; we will define it when X is complete
Чтобы спросить об этом по-другому, в объявлении функции std::vector<X> f();
, есть std::vector
, созданный с аргументом X
? Или, std::vector<X>
не создается, пока f()
не используется или не определено?
Аналогично, вызывает ли следующая процедура создания шаблона класса std::vector
?
class X;
typedef std::vector<X> XVector; // We will complete X before we use XVector
Пока я использую std::vector
в этих примерах, вопрос одинаково применим ко всем шаблонам.