在clang中强制`const char []`字符串文字

时间:2015-08-15 11:12:09

标签: c++ c++11 clang string-literals overload-resolution

编译以下代码

void f(char *, const char *, ...) {}
void f(const char *, ...) {}

int main()
{
    f("a", "b");
}

with 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字符串文字在C ++中是常量,因此重载规则应该从考虑中删除第一个变体,从而明确地解析为第二个变体。但是我认为Clang因兼容性原因而使它们成为非const(我知道MSVC也会这样做)。

用于解决此问题的编译器标志是什么?我已经使用-std=c++11进行了编译。

编辑:显式转换为const char*解决了这个问题:

    f((const char*)"a", "b");

但是,如果我认为观察到的编译器行为不是标准的,我想修复编译器行为而不是标准符合代码。

1 个答案:

答案 0 :(得分:5)

我认为这是一个错误。在C ++ 11中删除了将字符串文字转换为char *,并且我不知道在涉及它的转换序列的重载解析中有任何规定。

作为一种解决方法,不涉及将每个调用更改为f,您可以通过引用捕获数组来编写另一个使用字符串文字显式捕获每个调用的重载:

template<size_t N, typename ...F>
void f(char const (&a)[N], F&&... args)
{
    f((char const *)a, std::forward<F>(args)...);
}