Какие значения являются параметрами шаблона?Что я могу (не) делать с ними? - PullRequest
0 голосов
/ 24 апреля 2019

Можно ли присвоить значение параметру нетипичного шаблона?

Например

template<int N>
void foo(){
    N = 4;
}

Пытаясь скомпилировать это, я получаю:

error: lvalue required as left operand of assignment
     N = 4;
       ^

Какие значения (категория значений) являются параметрами шаблона и сколько я могу «поиграть с ними» в теле функций? (Т.е. их чтение, запись в них, пересылка их другим параметрам шаблона, печать их и т. Д.).

Например, как правильно создать шаблон функции, который «регистрирует» число (передается как параметр шаблона во время компиляции), а затем печатает это число каждый раз, когда он вызывается (во время выполнения)?

1 Ответ

2 голосов
/ 25 апреля 2019

Они приблизительно эквивалентны литералам с заданным значением. В C ++ 20 существует концепция LiteralType, которая является обязательным условием для использования в качестве параметра шаблона нетипичного типа.

От cppreference

Когда имя параметра шаблона нетипичного типа используется в выражении в теле шаблона класса, это неизменяемое значение prvalue, если его тип не является ссылочным типом lvalue

С стандарт

Нетипичный не ссылочный шаблон-параметр является предварительным значением. Он не должен быть назначен или каким-либо другим образом изменен. Нетипичный тип-параметр шаблона не может иметь свой адрес. Если в качестве инициализатора для ссылки используется не типовой не ссылочный шаблон-параметр, всегда используется временный.

...