template< typename _Type >
struct TypeChecker {};
template< typename _Type >
bool f0( _Type obj )
{
return TypeChecker< _Type >::value;
}
struct S {};
void f1()
{
f0( S{} );
}
template<>
struct TypeChecker< S > : std::true_type {};
Очевидно, что "TypeChecker : std :: true_type" неизвестен в точке, где определена f1 (), но и MSVC2019, и Clang компилируют это без ошибки.
Что я Я не уверен, является ли это гарантированным поведением по стандарту.
Я нашел несколько похожих вопросов в SO: Когда проверяется тип создания экземпляра шаблона C ++? Неполное использование класса в template Может ли точка инстанцирования быть отложена до конца единицы перевода?
И я считаю, что это релевантная часть из спецификации c:
Специализация для шаблона функции, шаблона функции-члена или для функции-члена или состояния c член данных шаблона класса может иметь несколько точек создания экземпляров в единице перевода, и в дополнение к точки инстанцирования, описанные выше, для любой такой специализации, которая имеет точку инстанцирования в единице перевода, также важен конец единицы перевода красная точка создания.
Но что именно означает "конец единицы перевода также считается точкой создания"? Означает ли это, что это зависит от реализации? Как «компилятор А» компилирует приведенный выше код без ошибок, а «компилятор Б» - нет, хотя оба они соответствуют стандарту?
Или этот код гарантированно корректен любым стандартным компилятором c ++?