编译以下代码
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/