c – 强制`const char []`字符串字符串

前端之家收集整理的这篇文章主要介绍了c – 强制`const char []`字符串字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编译以下代码
void f(char *,const char *,...) {}
void f(const char *,...) {}

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

与cl ang给我这个错误

prog.cpp:6:2: error: call to 'f' is ambiguous
        f("a","b");
        ^
prog.cpp:1:6: note: candidate function
void f(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");

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

解决方法

我认为这是一个bug.字符串字面值转换为char *在C11中被删除,我不知道有关涉及转换序列的重载分辨率的任何规定.

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

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

猜你在找的C&C++相关文章