hov*_*ovo 5 c++ templates overloading const
我有以下代码:
template<class A, class B>
void test(A& a, const B* b)
{ std::cout << "hi" << std::endl; }
template<class A, class B>
void test(A& a, const B** b)
{ std::cout << "hello" << std::endl; }
class TestClass
{};
int main()
{
int a = 5;
TestClass b;
TestClass* c = &b;
test(a, &c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不知何故输出是"hi",虽然似乎更好的匹配将是第二个模板功能.当我删除consts作为限定符B*,B**然后我得到"hello",它对应于第二个模板函数.在这种情况下,编译器如何选择要调用的函数?谢谢!
其他答案正确地指出,没有从T**到的隐式转换const T**,因此其中一个重载根本不可行。我将解释为什么不允许这种转换。它实际上是作为标准中的示例编写的。引用第4.4段,
\n\n\n[ 注意:如果程序可以将 T** 类型的指针分配给 const T** 类型的指针(即,如果允许下面的第 #1 行),则程序可能会无意中修改 const 对象(正如第 #2 行所做的那样)。\n 例如,
\n
int main() {\n const char c = \xe2\x80\x99c\xe2\x80\x99;\n char* pc;\n const char** pcc = &pc; // #1: not allowed\n *pcc = &c;\n *pc = \xe2\x80\x99C\xe2\x80\x99; // #2: modi\xef\xac\x81es a const object\n}\nRun Code Online (Sandbox Code Playgroud)\n