我已经查看过堆栈溢出时所提出的相关问题的所有答案,因为我写了这个问题,我已经搜索过了,我已经查看了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*
重载。我原以为模板是完全匹配的,另一个需要“衰变”/“转换”。
无论如何,感谢有识之士。
答案 0 :(得分:3)
在重载分辨率期间,通常首选函数优先于函数模板。
这意味着,如果存在可能接受适当参数的foo
重载(即使函数模板看起来更匹配),编译器也会选择此重载。
除此之外,第一次电话:
foo( 1, c_strg_1, "bla" );
无法实例化功能模板,因为c_strg_1
的类型为const char*
。