Позвольте мне выйти на конечность здесь.Поскольку вы явно говорите «константный указатель», я предполагаю, что вы не говорите об аргументах функции или даже возвращаемых значениях функции.Для аргумента функции, передаваемого копией, константность является несущественной деталью реализации:
void foo(T *); // declaration
void foo(T * const pt) // implementation,
{ /* ... */ } // pt is const inside the body (who cares?)
Следовательно, единственный случай использования, который приходит на ум, - это если вам нужно создать псевдоним где-то внутри вашего собственного кода.В этом случае я бы всегда предпочел ссылку.Сравните:
for (auto it = box.begin(); it != box.end(); ++it)
{
T & trinket = *it; // nice
T * const ptr = &*it; // wtpf?
// ...
}
Поскольку вы редактировали свой вопрос: очевидно, есть разница для аргументов функции.
void foo(T &);
void bar(T *);
В foo
вы гарантированно получите работоспособность,ссылка на изменяемый объект;в bar
вы должны проверить, является ли указатель не нулевым (давая вам понятие необязательный аргумент).В этом смысле T&
и T*
на самом деле не сопоставимы.