Да, у вас есть эта гарантия. Из [temp.inst]/11, курсив мой:
Реализация не должна неявно инстанцирует шаблон функции, переменной шаблон, шаблон члена, не-виртуальной функции члена, член класс или статический элемент данных шаблона класса , что не требует создания экземпляра.
Если вы не вызываете g()
, он не требует создания экземпляра, и поэтому не должно быть никаких вопросов, требующих myclass<0>{}.f()
.
Это та же гарантия, что позволяет использовать std::vector
и std::map
с типами, которые не по умолчанию построимых до тех пор, пока вы не делать вещи, как вызов resize()
и operator[]
соответственно.
Followup как Jarod42 points out, что явно инстанцирование myclass<0>
будет производить Assert, потому что, из [temp.explicit]/8:
Явного экземпляр, что имена шаблона класса специализация также является явной экземпляр такого же вида (декларация или определение) каждого из его членов (не включая членов, унаследованных от базовых классов и членов, которые являются шаблонами), которые ранее не были явно специализированы в переводе единица, содержащая явный экземпляр n, за исключением случаев, описанных ниже.
Исключения здесь не применяются.
Конечно, первым не создает экземпляр «г» (кроме того, частный характер функций) –
@ DieterLücking Изменен класс для структуры. – Vincent
@ Vincent f() следует обнародовать, а также g() –