Я могу ошибаться, но я думаю, что в основном этот вопрос сводится к следующему:
#include <iostream>
template <typename T>
int f(T const &)
{
//std::cout << __PRETTY_FUNCTION__ << "\n";
return 1;
}
template <typename T>
int f(T const *)
{
//std::cout << __PRETTY_FUNCTION__ << "\n";
return 2;
}
int main()
{
float c = 1.f;
float * addr = &c;
float const * addr_const = &c;
f(c); // 1
f(&c); // 1 you expected 2
f(addr); // 1 you expected 2
f(addr_const); // 2 as you expect
return 0;
}
Ваш параметр функции массива const такой же, как параметр указателя const в объявлении функции (поэтому я положил еготаким образом в примере).
Я думаю, что первая функция является базовым шаблоном, а вторая версия является более специализированной версией (поскольку для const T требуются только указатели).Таким образом, ссылка const выбирается, когда вы передаете указатель на non const.За исключением случая, когда вы действительно передаете ему указатель на const в качестве аргумента.
Если вы используете gcc (я думаю), вы можете использовать __PRETTY_FUNCTION__
для отображения выведенных аргументов