Подтвердить что ты не робот

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");

Но если я прав, что наблюдаемое поведение компилятора не является стандартным, я хочу исправить поведение компилятора, а не стандартный соответствующий код.

4b9b3361

Ответ 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)...);
}