不考虑过载,即使它看起来更匹配

Overload not considered even though it looks like a better match

gcc (live on godbolt) 和 clang 都拒绝了:

#include <string>

namespace
{
    std::string
    to_string(char const (&str) [14])
    { return str; }
}

void f()
{
    using std::to_string;
    char const hello[14] = "Hello, World!";
    (void) to_string(hello);
}

编译器考虑每个 std::to_string overloads 并得出结论:

error: no matching function for call to 'to_string(const char [14])'

如果我删除 using std::to_string,则会考虑并调用我的重载。为什么?如何修复它(除了删除 using)?

using 声明的范围很重要。这是一个正确的声明,因此名称隐藏生效。在函数内部,全局范围版本不可见。您需要重新引入它:

using ::to_string;
using std::to_string;

这个使用声明

using std::to_string;

隐藏全局命名空间中的声明。所以编译器看不到函数 ::to_string.

所以你必须写

using std::to_string;
using ::to_string;

并使未命名的命名空间内联。

inline namespace
{
    // ...
}