Есть ли разница между "T" и "const T" в параметре шаблона?
Есть ли разница между следующим синтаксисом 2:
template<int N> struct A; // (1)
и
template<const int N> struct A; // (2)
Любые общие рекомендации по использованию каждого синтаксиса?
Ответ 1
Нет.
§14.1 [temp.param] p5
[...] Квалификаторы верхнего уровня на шаблоне-параметре игнорируются при определении его типа.
Ответ 2
Я нашел это для быстрого поиска стандарта:
template<const short cs> class B { };
template<short s> void g(B<s>);
void k2() {
B<1> b;
g(b); // OK: cv-qualifiers are ignored on template parameter types
}
В комментарии говорится, что они игнорируются.
Я не рекомендую использовать const в параметрах шаблона, поскольку это необязательно. Обратите внимание, что это тоже не подразумевается - они являются постоянными выражениями, отличными от const.
Ответ 3
Выбор int был, вероятно, плохой идеей, но для указателей это имеет значение:
class A
{
public:
int Counter;
};
A a;
template <A* a>
struct Coin
{
static void DoStuff()
{
++a->Counter; // won't compile if using const A* !!
}
};
Coin<&a>::DoStuff();
cout << a.Counter << endl;