Il seguente codice funziona bene:Perché viene applicata la conversione definita dall'utente durante l'inizializzazione?
#include <iostream>
struct B
{
operator int()
{
return int();
}
};
struct A
{
A(int, int){ std::cout << "A(int, int)" << std::endl; }
};
A a({B(), B()});
int main()
{
}
e produce in uscita:
A(int, int)
Ma non posso ottenere perché? Che cosa dice la standard è:
Tuttavia, se si considera l'argomento di un costruttore o di funzione di conversione definita dall'utente che è un candidato da 13.3.1.3 quando invocato per la copia/spostamento della temporanea nel secondo passo di inizializzazione di una classe, da 13.3.1.7 quando si passa l'elenco di inizializzatore come un singolo argomento o quando l'elenco di inizializzazione ha esattamente un elemento e una conversione in qualche classe X o riferimento a (possibilmente con certificazione cv) X è considerato per il primo parametro di un costruttore di X [...] solo le sequenze di conversione standard e le sequenze di conversione ellissi sono considerate ed
Quindi nel nostro caso abbiamo considerato l'argomento del costruttore (era {B(), B()}
). Più precisamente, abbiamo passato l'inizializzatore-lista come un singolo argomento (il secondo caso nella regola che ho citato). Ora, dobbiamo convertire il primo elemento dell'elenco inizializzatore (temporaneo di tipo B
) in int
e l'unico modo per farlo è applicare la conversione definita dall'utente (B::operator int()
). Tuttavia, come detto alla fine della regola, ho citato solo le sequenze di conversione standard e le sequenze di conversione ellissi sono state considerate. Dal momento che quel codice non dovrebbe funzionare, dovrebbe lanciare l'errore come A(int, int)
non è praticabile o una specie di.
Cosa c'è che non va. Potrebbe essere un bug?
Non riesci a trovare questa citazione in N4140. Che bozza e paragrafo stai citando? – Columbo
@Columbo: C++ 11 13.3.3.1/4 –
possibile duplicato di [Distinzione tra sequenze di conversione definite dall'utente dalla sequenza di conversione standard iniziale] (http://stackoverflow.com/questions/11555950/distinguishing-between-user -delle sequenze di conversione definite-dallo standard iniziale) –