C ++, почему перегрузка (T &) в шаблоне с (T *) - PullRequest
0 голосов
/ 03 февраля 2019

в C ++, если метод принимает левая ссылка + только указатель ,

кажется достаточным, если у нас есть только шаблонный метод с T & в качестве его параметра, почему мы обычно перегружаемсятакже с test(T* )?

доказательство концепции: метод левой ссылки может принимать аргумент указателя.

#include <iostream>
using namespace std;

template<class T>
void test(T& arg) {
  T value = arg;
  cout << *value << endl;
}

int main() {
    int b = 4;
    int* a = &b;
    test(a); // compiles and runs without issue.
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Как упоминалось @HolyBlackCat, мы обычно хотим делать разные вещи для T& и T*.

Как указано в примере, для test(T&) нам обычно нужно вручную разыменовывать, это приведет кв разнице в поведении, поэтому имеет смысл иметь такую ​​перегрузку.

0 голосов
/ 03 февраля 2019

Почему [мы] обычно тоже перегружаемся test(T* )?

Я не уверен, что мы обычно делаем что-то подобное, но если бы кто-то перегрузил дляуказатель, это было бы потому, что указатели ведут себя иначе, чем типы объектов .Помните, что указатель на самом деле не объект, а адрес объекта.

Причина, по которой test(a) компилируется и запускается без проблем, заключается в том, что он принимает ссылку на указатель на объект как его параметр.Таким образом, когда строка cout << *value << endl; выполняется, указатель разыменовывается обратно к объекту, и мы видим, что 4 выводится на стандартный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...