Почему он называется параметром шаблона "не-тип"?
В терминологии шаблона С++ мы имеем параметры шаблона непигового типа, параметры шаблона типа и параметры шаблона шаблона (а затем тот же список с аргументами).
Почему он называется не-типом? Разве это не ценность? Разве это не "параметр шаблона значения"?
Пропустить что-нибудь, если я думаю о них как параметры шаблона значения?
Примечание: из любопытства я проверил документацию на языке D, и они называют это значением.
Ответы
Ответ 1
"value" имеет очень специфическое неинтуитивное определение в С++, которое необязательно применяется к аргументам шаблона непигового типа:
3.9 Типы [basic.types]
4 Представление объекта типа T
представляет собой последовательность объектов N unsigned char
, занятых объектом типа T
, где N равно sizeof(T)
. Представление значения объекта представляет собой набор бит, которые содержат значение типа T
. Для тривиально копируемых типов представление значений представляет собой набор бит в представлении объекта, который определяет значение, которое является одним дискретным элементом определенного набора значений.
Несмотря на то, что стандарт С++ иногда использует слово "значение" неофициально, хорошо, что они этого не сделали. Тип аргумента типа непигового типа не требуется тривиально копировать. В частности, как прокомментировал вопрос Майк Сеймур, это может быть ссылочный тип.
Тем не менее, я чувствую, что должен отметить, что я не думаю, что термин "параметр нестандартного шаблона" является правильным. Раньше это было, но теперь у нас есть параметры шаблона шаблона, которые не являются типами, но также не являются несимметричными параметрами шаблона.
Ответ 2
Я не являюсь частью комитета, но я бы сказал, что причина в том, что, хотя вы можете легко описать аргументы для параметров шаблона без типов типа int
или даже const char *
в качестве значения, он становится менее понятным для параметр шаблона непигового типа ссылочного типа, например std::string &
. Аргументом для этого параметра является объект, а не его значение.
Ответ 3
Будет более понятным, если рассмотреть стандартный класс std::array
Он объявлен следующим образом
template <class T, size_t N >
struct array;
Как видно, у него есть два параметра шаблона: тип параметра T и параметр non-type N. Почему N - непиковый параметр? Поскольку его тип уже определен и равен size_t
. Для этого непигового параметра N
вам нужно указать некоторое постоянное значение. Например
std::array<int, 10> aq1;
std::array<double, 20> a2;
T
является параметром типа, потому что мы должны предоставить тип в качестве аргумента шаблона, чтобы создать экземпляр объекта этого класса. Мы не можем предоставить значение, например,
std::array<10, 10> a3;
хотя 10 - целочисленный литерал типа int. Но мы можем написать
std::array<decltype( 10 ), 10> a4;
Сравните параметр первого аргумента шаблона и параметр аргумента второго шаблона.