在C ++模板术语中,我们有非类型模板参数,类型模板参数和模板模板参数(然后是带参数的相同列表)。
为什么称为非类型?这不是值吗?不应该是“价值模板参数”吗?
如果我将它们视为值模板参数,我会错过任何内容吗?
注意:出于好奇,我检查了D语言的文档,并将其称为值。
答案 0 :(得分:12)
"值"在C ++中有一个非常具体的非直观定义,它不一定适用于非类型模板参数:
3.9类型[basic.types]
4类型为
T
的对象的对象表示是由类型{的对象占用的 Nunsigned char
对象的序列{1}},其中 N 等于T
。对象的值表示是保存类型sizeof(T)
的值的位集。 对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,它是实现定义值集的一个离散元素。
即使C ++标准偶尔会使用" value"非正式地说,他们在这里没有做到这一点很好。非类型模板参数类型不需要是可轻松复制的。具体来说,正如Mike Seymour对此问题所评论的那样,它可能是一种参考类型。
那就是说,我觉得我应该注意到我不会想到术语"非类型模板参数"是正确的。它曾经是,但我们现在有模板模板参数,它们不是类型,但也不是非类型模板参数。
答案 1 :(得分:4)
我不是委员会成员,但我想说的是,虽然您可以轻松地将类型为int
甚至const char *
的非类型模板参数的参数描述为值,但它对于引用类型的非类型模板参数,例如,不太清楚std::string &
。该参数的参数是一个对象,而不是它的值。
答案 2 :(得分:0)
如果考虑标准类std::array
将更加清楚它是以下列方式声明的
template <class T, size_t N >
struct array;
如图所示,它有两个模板参数:类型参数T和非类型参数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;
比较第一个模板参数设置和第二个模板参数设置。