Я очень удивлен тем, что в различных образцах версии 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
в этой точке инстанцирования семантической ошибкой?
Соответствует ли стандарту (С++ 03 и/или С++ 11 Draft) эта программа хорошо сформированной, плохо сформированной, плохо сформированной, но диагностической не требуется, или undefined поведение?
Редактировать: @David Rodriguez - dribeas сообщает, что clang++, goau и Visual Studio 2010 также принимают аналогичный код.