c++ - 在 clang 中强制使用 `const char[]` 字符串文字

标签 c++ c++11 clang string-literals overload-resolution

编译以下代码

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)...);
}

关于c++ - 在 clang 中强制使用 `const char[]` 字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024138/

相关文章:

c++ - 如何在 macOS 中使用(链接)调试版本的 libc++?

c++ - WIN32 在哪里定义,我如何在我的项目中包含这个定义?

c++ - 超时错误 C++

c# - 如何模拟函数空间

c++ - 编译器如何知道必须调用 std::forward 函数的哪个重载?

c++ - clang++ (3.3/Xcode) 中 std::function 的定义在哪里

android - 从命令行为 arm64 构建 Qt 项目

C++ WCHAR : Cannot allocate an array of constant size 0

c++ - 扩展此模板 static_assert 代码以覆盖子类

c++ - 将 lambda 作为回调传递给 C 函数