Компиляция следующего кода
void f(char *, const char *, ...) {}
void f(const char *, ...) {}
int main()
{
f("a", "b");
}
с clang дает мне эту ошибку:
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 *, ...) {}
^
Строковые литералы AFAIK постоянны в С++, поэтому правила перегрузки должны отбрасывать первый вариант из рассмотрения, тем самым однозначно разрешая второй вариант. Но я думаю, что Clang делает их неконстантными по соображениям совместимости (я знаю, что MSVC тоже это делает).
Какие флаги компилятора использовать, чтобы исправить это? Я уже компилирую с -std=c++11
.
РЕДАКТИРОВАТЬ: Явный листинг в const char*
решает следующее:
f((const char*)"a", "b");
Но если я прав, что наблюдаемое поведение компилятора не является стандартным, я хочу исправить поведение компилятора, а не стандартный соответствующий код.