C++运算符查找误区

C++ operator lookup misunderstanding

下一个案例我有问题:

template<typename T>
void test(const T &ref){
     cout << "By reference";
}

template<typename T>
void test(const T *ptr){
     cout << "By pointer";
}

我发送给 test() 方法的任何参数将始终通过引用传递给重载。即使这样:

int *p = 0; test(p);

谁能告诉我为什么参考文献具有如此高的优先级以及在标准中的什么地方可以阅读这方面的内容。

哎呀……我不留神!我必须为指针情况指定 const 和非常量重载:

template<typename T>
void test(const T &ref){
     cout << "By reference";
}

template<typename T>
void test(T *ptr){
     cout << "By pointer";
}

template<typename T>
void test(const T *ptr){
     cout << "By const pointer";
}

你能检查一下模板中使用的是哪种类型,是int还是int*?我怀疑您将 T 检查为 int,但编译器将 T 解释为 int* 并使用参考模板。

尝试使用

test<int>(p);

明确指定类型

因为const T *意味着Tconst而不是T *

#include <iostream>
template<typename T>
void test(const T &ref){
     std::cout << "By reference\n";
}

template<typename T>
void test( T * const ptr){
     std::cout << "By pointer\n";
}


int main()
{
    int *p;
    test(p);
    return 0;
}

你也可以用typedef T * PtrT,然后把T * const改成const PtrT

template <typename T>
using PtrT = T *;

template<typename T>
void test(const PtrT<T> ptr){
     std::cout << "By pointer\n";
}