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.

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top