Sì, avete questa garanzia. Da [temp.inst]/11, corsivo mio:
L'attuazione non deve implicitamente istanziare una funzione di modello, un modello variabile, un modello di membro, una funzione di membro non virtuale, un membro classe, o membro di dati statici di un modello di classe che non richiede l'istanziazione.
Se non si chiama g()
, non richiede di un'istanza, quindi non ci dovrebbero essere problemi di chiamata myclass<0>{}.f()
.
Questa è la stessa garanzia che consente di utilizzare std::vector
e std::map
con i tipi non predefiniti costruibili fino a quando non fai le cose come chiamata resize()
e operator[]
, rispettivamente.
un follow-up, come Jarod42 points out, è che un'istanza esplicitamente myclass<0>
produrrà l'asserzione perché, da [temp.explicit]/8:
un'istanza esplicita che i nomi di un modello di classe di specializzazione è anche un esplicito istanza dello stesso tipo (dichiarazione o definizione) di ciascuno dei suoi membri (esclusi i membri ereditati dalla base classi e membri che sono modelli) che non è stato precedentemente esplicitamente specializzato nella unità di conversione contenente l'istanza esplicata n, ad eccezione di quanto descritto di seguito.
Le eccezioni non si applicano qui.
Certo, il primo non un'istanza di 'g' (inoltre, la natura privata delle funzioni) –
@ DieterLücking Classe modificata in struct. – Vincent
@Vincent f() deve essere reso pubblico così come g() –