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

c – 强制`const char []`字符串字符串,第1张

概述编译以下代码 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"); ^pr 编译以下代码
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 []`字符串字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存