Force `const char []` строковые литералы в clang
Компиляция следующего кода
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");
Но если я прав, что наблюдаемое поведение компилятора не является стандартным, я хочу исправить поведение компилятора, а не стандартный соответствующий код.
Ответы
Ответ 1
Я думаю, что это ошибка. Преобразование строковых литералов в char *
было удалено в С++ 11, и я не знаю о каком-либо условии в разрешении перегрузки для последовательности преобразования, связанной с ней.
В качестве обходного решения, которое не связано с изменением каждого вызова на f
, вы можете написать еще одну перегрузку, которая явно улавливает каждый вызов строковым литералом, захватывая массив по ссылке:
template<size_t N, typename ...F>
void f(char const (&a)[N], F&&... args)
{
f((char const *)a, std::forward<F>(args)...);
}