Почему он называется параметром шаблона "не-тип"?

В терминологии шаблона С++ мы имеем параметры шаблона непигового типа, параметры шаблона типа и параметры шаблона шаблона (а затем тот же список с аргументами).

Почему он называется не-типом? Разве это не ценность? Разве это не "параметр шаблона значения"?

Пропустить что-нибудь, если я думаю о них как параметры шаблона значения?

Примечание: из любопытства я проверил документацию на языке 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;

Сравните параметр первого аргумента шаблона и параметр аргумента второго шаблона.