Реальный ответ может быть ¯ \ _ (ツ) _ / ¯, но, вероятно, в настоящее время все в порядке, потому что шаблоны магические, но это может быть более явно не в ожидании решения некоторых других основных проблем.
Во-первых, главная проблема, конечно, это [class.mem] / 14 :
Нестатические члены данных не должны иметь неполные типы.
Вот почему ваш пример не по шаблону неверен. Однако согласно [temp.point] / 4 :
Для специализации шаблона класса, специализации шаблона члена класса или специализации для члена класса шаблона класса, если специализация неявно создается, поскольку на нее ссылаются из другой специализации шаблона, если контекст, из которого эта специализация Ссылка зависит от параметра шаблона, и, если специализация не была создана до создания экземпляра включающего шаблона, точка создания находится непосредственно перед точкой создания включающего шаблона . В противном случае точка создания такой специализации непосредственно предшествует объявлению или определению области пространства имен, относящемуся к специализации.
Что предполагает, что foo_impl<void>::bar
создается до foo_impl<void>
, и, следовательно, завершается в момент, когда создается экземпляр нестатического элемента данных типа bar
. Так что, может быть, все в порядке.
Однако , основные языковые проблемы 1626 и 2335 имеют дело с не совсем такими же, но все еще довольно похожими проблемами, касающимися полноты и шаблоны, и оба указывают на желание сделать случай шаблона более совместимым с случаем без шаблона.
Что все это значит, если рассматривать в целом? Я не уверен.