compilando il seguente codice diForza `const char []` letterali stringa in clang
void f(char *, const char *, ...) {}
void f(const char *, ...) {}
int main()
{
f("a", "b");
}
con clangore mi da questo errore:
prog.cpp:6:2: error: call to 'f' is ambiguous
f("a", "b");
^
prog.cpp:1:6: note: candidate function
void f(char *, const char *, ...) {}
^
prog.cpp:2:6: note: candidate function
void f(const char *, ...) {}
^
stringhe letterali AFAIK sono costanti in C++, e così la le regole di sovraccarico dovrebbero eliminare la prima variante dalla considerazione, risolvendo così inequivocabilmente la seconda variante. Ma immagino che Clang li renda non-const per ragioni di compatibilità (so che anche MSVC lo fa).
Quali flag del compilatore utilizzare per risolvere questo problema? Sto già compilando con -std=c++11
.
EDIT: esplicita cast const char*
risolve questo:
f((const char*)"a", "b");
Ma se sono corrette sul che il comportamento del compilatore osservato non è standard, voglio correggere il comportamento del compilatore, piuttosto che lo standard codice conforme
@ Jarod42: perché Mi piace il nome. Se il codice non è rotto, non penso che "aggiustarlo" sia la soluzione giusta. – ybungalobill
Definire il primo parametro fittizio, ad es. 'char' type. Aiuterà C++ a differenziare lo 'sprintf 'originale e la tua versione. Metterai 0 come primo parametro. – i486
Ho cercato qualche tempo fa un commutatore per disattivare questa orribile conversione in 'char *', ma non ne ho trovato nessuno. Almeno, non documentato. Tempo di aggiungerne uno, immagino? MSVC ha alcuni switch "string string" btw. – dyp