In 5.1.1/3 di C++ norma [expr.prim.general]`* questo` al di fuori del corpo della funzione membro?
Diversamente l'espressione oggetto in altri contesti, * questo non è necessario che sia di tipo completo per scopi di accesso membro della classe esterni il corpo della funzione membro. Solo i membri della classe dichiarati prima alla dichiarazione sono visibili.
E poi questo esempio:
struct A {
char g();
template<class T> auto f(T t) -> decltype(t + g())
{ return t + g(); }
};
template auto A::f(int t) -> decltype(t + g());
Può spiegare la citazione e l'esempio? Cosa viene dimostrato esattamente qui?
Credo si riferisce all'utilizzo di 'A :: G' nella firma di 'f' invece del suo corpo. Complifica le cose per gli scrittori di compilatori, perché ti viene chiesto di (potenzialmente) eseguire una risoluzione di sovraccarico su 'g()', prendendo in considerazione 'A :: g', anche se' A' non è completamente definito. Prima di questo, una cosa tipica era analizzare prima tutte le dichiarazioni (di metodi e membri) e quindi usare un "A" completamente definito per analizzare i corpi dei metodi. –
@MatthieuM .: Notare che è esterno al corpo della funzione. È comunque necessario rimandare l'analisi dei corpi delle funzioni in linea fino a dopo aver analizzato un identificatore di classe. –