Ответ 1
Он игнорируется:
[C++11: 14.1/4]:
Параметр шаблона, не относящийся к типу, должен иметь один из следующих (необязательно cv-квалифицированных) типов:
- интегральный или перечисляемый тип,
- указатель на объект или указатель на функцию,
- ссылка lvalue на ссылку на объект или lvalue для функции,
- указатель на член,
std::nullptr_t
.
[C++11: 14.1/5]:
[Примечание. Другие типы запрещены явно или неявно правилами, определяющими форму шаблона-аргумента (14.3). -end note] Квалификаторы верхнего уровня для параметра шаблона игнорируются при определении его типа.
Такая же формулировка присутствует в том же месте в С++ 03.
Это частично потому, что аргументы шаблона должны быть известны во время компиляции. Итак, есть ли у вас const
или нет, вы не можете передать какое-то значение переменной:
template <int N>
void f()
{
N = 42;
}
template <int const N>
void g()
{
N = 42;
}
int main()
{
f<0>();
g<0>();
static const int h = 1;
f<h>();
g<h>();
}
prog.cpp: В функции ' void f() [с int N = 0]:
prog.cpp: 15: созданный здесь
prog.cpp: 4: ошибка: lvalue требуется как левый операнд присваивания
prog.cpp: В функции ' void g() [с int N = 0]:
prog.cpp: 16: созданный здесь
prog.cpp: 10: ошибка: lvalue требуется как левый операнд присваивания
prog.cpp: В функции ' void f() [с int N = 1]:
prog.cpp: 19: созданный здесь
prog.cpp: 4: ошибка: lvalue требуется как левый операнд присваивания
prog.cpp: В функции ' void g() [с int N = 1]:
prog.cpp: 20: созданный здесь
prog.cpp: 10: ошибка: lvalue требуется как левый операнд присваивания