Я очень удивлен, что в различных версиях 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 также принимают аналогичный код.