Неполное использование класса в шаблоне

Я очень удивлен, что в различных версиях g ++ из выборок следующие компоненты компилируются без ошибок или предупреждений:

// Adapted from boost::checked_delete()
template <class T> inline void assert_complete()
{
  typedef char type_must_be_complete[ sizeof(T) ? 1 : -1 ];
  (void) sizeof(type_must_be_complete);
}

class X;

void f()
{
  assert_complete<X>();
}

class X {};

int main() {}

Если определение X отсутствует или в другой единице перевода я получаю ошибки.

Но в программе, как указано выше, не является ли определение f единственной точкой создания моего шаблона? И не является ли неполнота X в этой точке создания семантической ошибкой?

Называет ли Стандарт (C ++ 03 и / или C ++ 11 Draft) эту программу правильно сформированной, плохо -формированный, плохо сформированный, но не требующий диагностики, или неопределенное поведение?

Edit: @David Rodriguez - dribeas сообщает, что clang ++, comeau и Visual Studio 2010 также принимают аналогичный код.

14
задан aschepler 26 October 2011 в 00:51
поделиться