const char数组模板vs char const * function overload

时间:2018-02-02 19:30:23

标签: c++ c++11 templates overload-resolution

我已经查看过堆栈溢出时所提出的相关问题的所有答案,因为我写了这个问题,我已经搜索过了,我已经查看了STL's video关于重载决策的问题,试图弄清楚是什么使得以下代码选择模板上的char const*重载,但我无法弄明白。

#include <cstdio>

void foo( int i, char const* c_str_1, char const* c_str_2 )
{
   printf( "foo( int i, char const* c_str_1, char const* c_str_2 )\n" );
}

template< std::size_t N, std::size_t M >
void foo( int i, char const (&c_str_1)[N], char const (&c_str_2)[M] )
{
   printf( "foo( int i, char const (&c_str_1)[N], char const (&c_str_2)[M] )\n" );
}


int main( int argc, char* argv[] )
{
   char const* c_strg_1 = "This is a c style string.";
   foo( 1, c_strg_1, "bla" );
   foo( 1, "bla", "bla" );
   return 0;
}

这可能是我遗漏的明显事物,但编译器总是选择char const*重载。我原以为模板是完全匹配的,另一个需要“衰变”/“转换”。

无论如何,感谢有识之士。

1 个答案:

答案 0 :(得分:3)

在重载分辨率期间,通常首选函数优先于函数模板。

这意味着,如果存在可能接受适当参数的foo重载(即使函数模板看起来更匹配),编译器也会选择此重载。

除此之外,第一次电话:

foo( 1, c_strg_1, "bla" );

无法实例化功能模板,因为c_strg_1的类型为const char*