Гарантирует ли стандарт C ++ точку создания шаблона в этом случае? - PullRequest
1 голос
/ 07 марта 2020
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 ++?

1 Ответ

1 голос
/ 07 марта 2020

Ваша программа плохо сформирована, диагностика не требуется c требуется , поскольку явная специализация не определена до (первого) места, где она (или будет) неявно создана. Дело создания экземпляра - это что-то вроде красной селедки: она управляет поиском имени, а не действительностью (за исключением того, что это также плохо сформированный отчет о недоставке, чтобы результаты этого поиска зависели от того, какая из нескольких точек создания экземпляра выбрана).

...