struct S {T t { expr };};
è un inizializzatore membro di dati non-statico che non utilizza il segno di uguale.
struct S{T t = { expr };};
è un inizializzatore di dati di dati non statici che utilizza il segno di uguale.
Il primo caso è un diretta-list-inizializzazione mentre il secondo è un copia-list-inizializzazione.
La differenza tra -list-inizializzazione diretta e copia-list-inizializzazione è che per il primo caso entrambi esplicitamente costruttori e non esplicite sono considerati, mentre per il secondo unico non esplicito i costruttori possono essere chiamati.
Per chiarire, si consideri il seguente esempio:
struct Foo {
int i;
explicit Foo(int i_) : i(i_) {}
};
struct Bar {
Foo f {1};
};
Live Demo
In questo esempio Foo
ha un costruttore explicit
e Bar
diretto inizializza suo membro f
di tipo Foo
. Il codice di esempio compila bene poiché per l'inizializzazione diretta sono considerati entrambi i costruttori explicit
e non-explicit
.
Ora modifichiamo l'esempio trasformando l'inizializzatore del membro dati non statici senza utilizzare il segno di uguale, ovvero un caso di inizializzazione di elenchi diretti in un inizializzatore di un membro di dati non statici con l'uso del segno di uguale, che è un caso di inizializzazione della lista di copia.
struct Foo {
int i;
explicit Foo(int i_) : i(i_) {}
};
struct Bar {
Foo f = {1};
};
Live Demo
Ora l'esempio di cui sopra non compila ed emette un errore:
error: chosen constructor is explicit in copy-initialization
Questo è previsto perché, come già accennato in copia-list-inizializzazione unico non-esplicito i costruttori possono chiamare.
Ora per gli enumeratori e altri tipi di integrale, la differenza visualizzata sopra non si applica (vale a dire, non sono coinvolti costruttori). In quanto tale, le due affermazioni (cioè, [1] e [2]) sarebbero equivalenti.
Ma per completezza, consente di prendere in considerazione i seguenti esempi:
enum class Foo {A, B, C};
struct Bar {
Foo f{Foo::A};
};
e
enum class Foo {A, B, C};
struct Bar {
Foo f = {Foo::A};
};
Entrambi gli esempi compilare bene.
Considera anche i seguenti esempi:
struct Bar {
int i {1};
};
e
struct Bar {
int i = {1};
};
Entrambi gli esempi anche compilare bene.
Perché dovrebbe essere ..? –