Inoltro a un inizializzatore aggregato?

Inoltro a un inizializzatore aggregato?

Per quello che vale, P0960 "Consenti l'inizializzazione di aggregati da un elenco di valori tra parentesi" fa esattamente quello che dice. Sembra aver superato EWG ed è in arrivo in C++20.

Non è corretto. Tutte le classi hanno costruttori predefiniti, nonché costruttori di copia/spostamento. Anche se = delete o vengono eliminati implicitamente, tecnicamente hanno ancora tali costruttori (non puoi semplicemente chiamarli).

Essendo C++ C++, ci sono naturalmente casi d'angolo in cui anche P0960 fa la "cosa sbagliata", come indicato nel documento:

struct A;

struct C
{
  operator A(); //Implicitly convertible to `A`
};

struct A { C c; }; //First member is a `C`

C c2;
A a(c2);

L'inizializzazione di a è un caso di ambiguità. Due cose potrebbero accadere. Potresti eseguire la conversione implicita di c2 a un A , quindi inizializza a dal valore risultante. Oppure potresti eseguire l'inizializzazione aggregata di a da un singolo valore di tipo C .

P0960 prende il percorso compatibile con le versioni precedenti:se un costruttore potrebbe essere chiamato (secondo le regole esistenti), allora ha sempre la priorità. Le parentesi richiamano l'inizializzazione aggregata solo se non è presente alcun costruttore che avrebbe potuto essere chiamato.