在 clang 中强制使用 `const char[]` 字符串文字
Force `const char[]` string literals in clang
编译以下代码
void f(char *, const char *, ...) {}
void f(const char *, ...) {}
int main()
{
f("a", "b");
}
用 clang 给我这个错误:
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");
但是如果我观察到的编译器行为不符合标准这一点是正确的,那么我想修复编译器行为而不是符合标准的代码。
我认为这是一个错误。将字符串文字转换为 char *
已在 C++11 中删除,我不知道在涉及它的转换序列的重载解析中有任何规定。
作为不涉及更改对 f
的每个调用的解决方法,您可以编写另一个重载,通过引用捕获数组来显式捕获每个使用字符串文字的调用:
template<size_t N, typename ...F>
void f(char const (&a)[N], F&&... args)
{
f((char const *)a, std::forward<F>(args)...);
}
编译以下代码
void f(char *, const char *, ...) {}
void f(const char *, ...) {}
int main()
{
f("a", "b");
}
用 clang 给我这个错误:
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");
但是如果我观察到的编译器行为不符合标准这一点是正确的,那么我想修复编译器行为而不是符合标准的代码。
我认为这是一个错误。将字符串文字转换为 char *
已在 C++11 中删除,我不知道在涉及它的转换序列的重载解析中有任何规定。
作为不涉及更改对 f
的每个调用的解决方法,您可以编写另一个重载,通过引用捕获数组来显式捕获每个使用字符串文字的调用:
template<size_t N, typename ...F>
void f(char const (&a)[N], F&&... args)
{
f((char const *)a, std::forward<F>(args)...);
}