为什么在<double>STL中允许

why <double> is allowed in STL

本文关键字:STL double lt 为什么 gt      更新时间:2023-10-16

我已经看到模板不能用double定义,因为它不是整数值。 例如,以下代码不会编译:

template <double x> double func()
{
return x;
}

但是,我想知道为什么在STL中允许定义双精度容器? 谢谢!

您正在混合类型名称和类型实例。 当您执行以下操作时:

template <int a> struct A {};

您正在声明一个模板结构,该结构将因标记而异,并且此标记是一个整数。 因此,A<1>A<2>将是完全不同的类型。

当您执行以下操作时:

template <typename T> struct A { T a; A(T a) : a(a) {} };

您正在声明一个模板结构,该结构因给定的类型而异。因此,你不能这样写:A<1>A<2>因为12不是一个类型,而是一个值。

您将编写A<int>并且任何 int 都将使用相同的类型,因此A<int> a(1)A<int> b(2)完全相同

的类型

您将模板类型参数与模板非类型参数混淆了。在您的示例中,参数是类型double的值。在std::vector<double>中,参数是类型double

double值并不是真正用来比较相等的,而类型double则没有这样的问题。

我想知道为什么在 STL 中允许定义双精度容器?

因为 double 的容器不需要具有 double 类型的模板非类型参数。该语言允许将任何类型的类型(包括 double(传递到模板类型参数中,这是泛型容器用于指定值类型的参数。

C++不允许将浮点文字用作模板非类型参数。Cf,整数类型:

template <int N> class foo{};

是允许的,但

template <double N> class bar{};

莫。这背后的理由是,浮点类型的许多实现不是由标准指定的。因此,很难确定哪种专业化bar适用。