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 functionvoID f(char *,...) {} ^prog.cpp:2:6: note: candIDate functionvoID 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 – 强制`const char []`字符串字符串全部内容,希望文章能够帮你解决c – 强制`const char []`字符串字符串所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)