2016-04-19 12 views
9

ho familiarità con l'utilizzo di graffe bretelle/elenchi di inizializzazione per evitare il restringimento quando inizializzazione una variabile, ma è una buona pratica di usarla quando assegnazione un valore ad una variabile anche tu?C++: usare le parentesi graffe per evitare il restringimento durante l'assegnazione

Ad es.

int i{1};  // initialize i to 1 
double d{2.0}; // initialize d to 2.0 
i = {2};  // assign value 2 to i 
i = {d};  // error: narrowing from double to int 

C'è un motivo per non utilizzare parentesi graffe per l'assegnazione?

+5

se si desidera restringere? – xaxxon

+0

Direi: non usarli negli incarichi – Exceptyon

+0

avere una lettura di: https://herbsutter.com/2013/05/09/gotw-1-solution/ e possibilmente https://herbsutter.com/2013/ 12/08/GotW-94-soluzione-aaa-style-quasi-sempre-auto / –

risposta

2

Non è un problema di inizializzazione o di assegnazione.

È un problema di diversi tipi.

Se si tenta di inizializzare una variabile int con un double, si ottiene lo stesso errore.

E è possibile assegnare a un'altra variabile double.

int main() 
{ 
    int i{1};  // initialize i to 1 
    //int i2{3.0}; // ERROR! 
    double d{2.0}; // initialize d to 2.0 
    double d2{1.0}; // initialize d2 to 1.0 
    i = {2};  // assign value 2 to i 
    //i = {d};  // error: narrowing from double to int 
    d2 = {d};  // OK 

    return 0; 
} 

Il tuo esempio, arricchito.

Una buona pratica quando si assegna un valore? Può essere se si vuole essere sicuri di non perdere la precisione.

Un esempio: è possibile scrivere una funzione template assign() in questo modo

template <typename X, typename Y> 
void assign (X & x, Y const & y) 
{ x = {y}; } 

così si è sicuri di evitare restringimento

// i is of type int 
assign(i, 23); // OK 
assign(i, 11.2); // ERROR! 

Se (quando) restringimento non è un problema, è può evitare le parentesi graffe.

Problemi correlati