La mia domanda riguarda questo codice molto semplice e breve in cui viene tentata una risoluzione di sovraccarico tra due funzioni non modello che accettano un parametro di riferimento matrice. La domanda è stata pubblicata altrove, ma in un contesto di deduzione del modello. Ecco il codice:Initializer_list come argomento per un parametro di riferimento di matrice in un contesto non modello
#include <iostream>
void foo (const int (&x) [3]) { std::cout << "3\n"; }
void foo (const int (&x) [2]) { std::cout << "2\n"; }
int main()
{
foo({1,2,3});
}
g ++ 4.8.3 compila questo codice selezionando la prima funzione (suppongo), l'unica praticabile, mentre clang 3.4 non si compila, dicendo che la chiamata a foo è ambiguo (perché?).
Quale compilatore fa la cosa giusta?
clang non compila il codice rimuovendo anche il secondo sovraccarico: sembra che un inizializzatore non sia semplicemente accettato per inizializzare un riferimento di array.
È questo buggy?
"clang non compilare il codice anche rimuovendo il secondo sovraccarico "- Lo fa per me (se il secondo sovraccarico viene rimosso come dici tu, usando clang 3.4.2, a patto che' -std = C++ 11' sia incluso nelle opzioni della riga di comando . Quale versione e quale invocazione non riesce per te? – hvd
Hai ragione: dopo aver rimosso il secondo overload ho compilato il codice dimenticando il flag -std = C++ 11. Perdonami per quello. – GSi
Ora ho definito un alias di comando per evitare un simile errore in futuro ... – GSi