Ответ 1
Да, у вас есть эта гарантия. Из [temp.inst]/11, акцент мой:
Реализация не должна неявно создавать шаблон функции, шаблон переменной, шаблон-член, не виртуальная функция-член, класс-член или статический член данных шаблона класса , который не требует создания экземпляра.
Если вы не вызываете g()
, это не требует создания экземпляра, поэтому не должно быть проблем с вызовом myclass<0>{}.f()
.
Это та же самая гарантия, которая позволяет использовать std::vector
и std::map
с типами, которые не являются конструктивными по умолчанию, если вы не выполняете такие функции, как call resize()
и operator[]
, соответственно.
Далее, поскольку Jarod42 указывает, заключается в том, что явно создавая экземпляр myclass<0>
будет выдавать утверждение, потому что из [temp.explicit]/8:
Явное инстанцирование, которое называет специализацию шаблона класса, также является явным такой же вид (декларация или определение) каждого из его членов (не считая членов, унаследованных от базы классы и члены, которые являются шаблонами), которые ранее не были явно специализированы в переводе единица, содержащая явное инстанцирование, за исключением случаев, описанных ниже.
Исключения здесь не применяются.