Есть ли разница между "T" и "const T" в параметре шаблона? - PullRequest
29 голосов
/ 13 марта 2012

Есть ли разница между следующим 2 синтаксисом:

template<int N> struct A;         // (1)

и

template<const int N> struct A;   // (2)

Какое общее руководство по использованию каждого синтаксиса?

Ответы [ 3 ]

27 голосов
/ 13 марта 2012

Нет.

§14.1 [temp.param] p5

[...] Квалификаторы верхнего уровня cv в параметре шаблона игнорируются при определении его типа.

5 голосов
/ 13 марта 2012

Я нашел это, делая быстрый поиск по стандарту:

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.

2 голосов
/ 13 марта 2012

Выбор 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;
...