编译以下代码

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

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

用c给我这个错误:
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使它们成为非常量(我知道MSVC也会这样做)。

哪些编译器标志可用于解决此问题?我已经在使用-std=c++11进行编译。

编辑:显式转换为const char*可解决此问题:
    f((const char*)"a", "b");

但是,如果我对观察到的编译器行为不是标准的说法是正确的,那么我想修复编译器行为,而不是标准的符合标准的代码。

最佳答案

我认为这是一个错误。在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)...);
}

关于c++ - 在Clang中强制 `const char[]`字符串文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32024138/

10-11 19:03