Почему этот константный аргумент не может соответствовать параметру шаблона, отличному от типа?

При компиляции приведенного ниже кода с помощью gcc я получаю сообщение об ошибке: 'i' не может появляться в константном выражении.

Почему это?

#include <iostream>

using namespace std;
template<int p>
class C
{
public:
    void test();
};

template<int p>
void C<p>::test()
{
    p = 0;
}

char const *const p = "hello";
int main()
{
    const int i = (int)p;
    C<i> c;
}

person hu wang    schedule 16.08.2012    source источник
comment
Вы не можете присвоить значение параметру шаблона p = 0.   -  person Kirill Kobelev    schedule 16.08.2012


Ответы (1)


Переменная i не является изменяемой во время выполнения, поскольку она равна const, но это не "постоянное выражение", поскольку оно не оценивается во время компиляции.

(int)p; это reinterpret_cast. Целочисленные константные выражения не могут иметь reinterpret_cast. Явно запрещено (§5.19/2):

условное-выражение – это базовое константное выражение, если только оно не включает одно из следующих потенциально оцениваемых подвыражений (§3.2), но подвыражения логического И (§5.14), логическое ИЛИ (§5.15) и условные (§5.16) операции, которые не оцениваются, не рассматриваются [Примечание: Перегруженный оператор вызывает функцию. — конец примечания]:

— [...]

— a reinterpret_cast (§5.2.10);

— [...]

person R. Martinho Fernandes    schedule 16.08.2012