为什么叫它"非类型"模板参数?

时间:2014-11-11 09:43:44

标签: c++ templates non-type

在C ++模板术语中,我们有非类型模板参数,类型模板参数和模板模板参数(然后是带参数的相同列表)。

为什么称为非类型?这不是吗?不应该是“价值模板参数”吗?

如果我将它们视为值模板参数,我会错过任何内容吗?

注意:出于好奇,我检查了D语言的文档,并将其称为值。

3 个答案:

答案 0 :(得分:12)

"值"在C ++中有一个非常具体的非直观定义,它不一定适用于非类型模板参数:

  

3.9类型[basic.types]

     

4类型为T的对象的对象表示是由类型{的对象占用的 N unsigned 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;

比较第一个模板参数设置和第二个模板参数设置。

相关问题