Cosa posso dedurre dal codice di qualcuno quando usano l'inizializzazione diretta con le parentesi graffe anziché Parenthese?

3

Fino ad ora, ho inizializzato la maggior parte delle mie variabili in quanto tali:

const QString foo("bar");

Che dalla mia nuova comprensione è noto come inizializzazione diretta ( link )

Stavo guardando il codice di qualcuno, e in uno spazio dei nomi stavano inizializzando le loro variabili con le parentesi graffe:

const QString foo{"bar"};

che conta anche come inizializzazione diretta:

Non ho mai saputo che fosse una cosa fino ad oggi.

Il codice viene letto più spesso di quanto scritto, cosa implica l'inizializzazione diretta con le parentesi graffe rispetto alle parentesi?

Proprio come comprendo un const mi dirà che una variabile non cambierà, posso dedurre qualcosa da questa pratica di bretelle?

    
posta Akiva 19.05.2017 - 14:37
fonte

2 risposte

5

Questo dimostra che l'autore sta usando il moderno C ++ (ad es. > = C ++ 11) e applica buone pratiche:

Braced initialization is the most widely usable initialization syntax, it prevents narrowing conversions and it's immune to C++'s most vexing parse.

-- Scott Meyers, in Effective Modern C++, Item 7

Devi essere consapevole che potrebbe esserci comunque una sottigliezza se una classe ha un costruttore da un elenco di inizializzazione.

Se non hai familiarità con questa sintassi, ti consiglio vivamente di leggere il libro sopra menzionato di Scott Meyer o di acquisire conoscenze equivalenti per esempio con I video di Herb Sutter , per non finire con le competenze obsolete in C ++.

    
risposta data 20.05.2017 - 13:26
fonte
1

Non penso che tu possa dedurre molto da niente. Ci sono semplicemente troppe possibilità qui per trarre un'inferenza significativa.

Per prima cosa, tieni presente che tutti gli aggregati possono essere inizializzati usando le parentesi:

struct foo { 
    int x;
    long y;
};

// well formed since long before C++ existed:    
foo bar = { 1, 2 };

// New syntax
foo baz { 2, 3 };

Quindi, l'unica differenza in questo caso è di lasciare il = tra il nome della variabile e l'inizializzatore. È abbastanza comodo, ma non significa molto. Questo potrebbe letteralmente essere il caso di voler usare la vecchia sintassi, mancando il = a causa di un refuso e mai correggendolo / notandolo perché il compilatore non ha dato un messaggio di errore.

Tenendo questo a mente, prendiamo in considerazione i casi in cui una volta dovevi usare i parents anziché le parentesi graffe.

struct abc { 
    int x;
    abc(int x) : x(x) {}
};

Quindi, in C ++ 98/03, abbiamo fatto un'inizializzazione di questo tipo:

abc def(1);

Ora possiamo usare:

abc def = {1};

o

abc def{1};

Ancora una volta, penso che sia del tutto possibile che in un numero ragionevole di casi, il caso abc def = {1}; avvenga interamente per caso. Qualcuno lo ha scritto senza verificare se abc fosse un aggregato o meno. Un tempo, il compilatore si sarebbe lamentato e l'avrebbero modificato per farlo compilare. Il compilatore non si lamenta più, quindi lo lasciano in pace.

Non fraintendermi: sono a favore di evitare il restringimento delle conversioni 1 . Ma, data la natura umana (e la quantità di C ++ che vedo scritta senza conoscere tutti i dettagli intimi dello standard, per non parlare di tutti i suoi cambiamenti più recenti) penso che ci siano probabilmente un buon numero di casi in cui cose come questa accadono di più o meno per caso, e dal momento che lavorano sono lasciati soli.

1. Sono molto meno entusiasta di tutto ciò che viene interpretato come una lista di inizializzazione se possibile comunque.

    
risposta data 24.05.2017 - 00:35
fonte

Leggi altre domande sui tag