Identiche classe nomi dei membri e argomento di funzione Nomi in C ++
Domanda
Ho un semplice oggetto che contiene alcuni dati [pubblici].
Voglio mantenere la mia interfaccia pulita, quindi non voglio pre / post-fix di tutto per i nomi delle variabili pubblicamente accessibili né ai nomi dei miei argomenti delle funzioni.
Detto questo, ho finito per fare qualcosa di simile:
template<typename T> struct Foo
{
explicit Foo(T x) : x(x) // This [i.e., x(x)] seems to be doing the "Right Thing", but is this well defined?
{/* ^
No pre-/post- fixing.
*/
}
T x; // No pre-/post- fixing.
};
Giusto per ribadire: Tutto quello che chiedo è se questo comportamento è ben definito. Non se devo o non debbano essere facendo questo ...
Grazie.
Soluzione
Sì, va bene, e perfettamente standard.
Le variabili locali vengono sempre prima di una ricerca del nome, ma il x(...)
in un elenco di inizializzazione può ovviamente fare riferimento solo alle variabili membro [edit: o una classe di base].
Se non si utilizza la lista di inizializzazione, si dovrebbe scrivere:
explicit Foo(T x)
{
this->x = x;
}
Altri suggerimenti
In particolare il comportamento per la lista di inizializzazione di un ctor, è ben definito -. Dal momento che è possibile inizializzare solo una classe di membro o di base, non c'è ambiguità tra uno di quelli e il nome di un parametro
In quasi ogni altra circostanza, tuttavia, si creerà un'ambiguità. In particolare, il titolo si riferisce semplicemente a "funzione" - e per qualsiasi funzione diversa dalla ctor, questo non funzionerà. Anche all'interno del corpo del ctor, non funzionerà - il trattamento "speciale" è puramente all'interno della lista di inizializzazione di un ctor
.