C++模板 - 几个专业 - 行为是否定义?

C++ template - several specializations - is behaviour defined?

本文关键字:定义 是否 几个 模板 C++      更新时间:2023-10-16

假设我声明了一个模板化结构:

template <int N> struct mystruct;

假设我的结构对所有N都有一般行为,除了N == 0

例如,我可以声明一个特殊的行为,用于N == 0

template<> struct mystruct<0> {int k = 0};

我还可以声明一般行为:

template<int N> struct mystruct {float k = 3.14;};

如果我在主要运行:

struct mystruct<-1> x;
struct mystruct<0> y;
struct mystruct<1> z;
std::cout << x.k << " " << y.k << " " << z.k << std::endl;

我得到我想要的:3.14 0 3.14,无论模板声明的顺序如何。

但是,我想知道这种行为是否投保。事实上,当我宣布:

struct mystruct<0> y;

在我看来,这也可以由mystruct实现来定义。

所以问题是:

C++规范化是否确保模板专用化<0>覆盖一般的基本实现<int N>,无论代码中的模板专用顺序如何?

对于您的特定情况,因为专业化必须出现在主模板之后,并且假设它们出现,那么是的。否则,如果一个 TU 看到专业化,而另一个没有,并且他们都使用mystruct<0>,你会得到未定义的行为。

在一般情况下,由于许多专业可能相当复杂,C++标准在 [temp.expl.spec]/7 中这样说,强调我的:

为函数放置显式专用化声明 模板、类模板、变量模板、成员函数 类模板,静态数据 类模板的成员,成员 类模板的类、类模板的成员枚举、 成员类模板的类模板、成员函数模板 类模板,类模板的静态数据成员模板, 成员函数 类模板的成员模板,成员 非模板类的成员模板函数,静态数据 非模板类的成员模板,成员函数模板 类模板等的成员类,以及部分的放置 类模板、变量模板的专用化声明, 非模板类的成员类模板,静态数据成员 非模板类的模板,类的成员类模板 模板等会影响程序是否根据格式正确 到明确专业化的相对定位 声明及其在翻译单元中的实例化点 如上文和下文所述。在撰写专业时,请 注意它的位置;或者让它编译将是这样的试验 至于点燃它的自焚。

C++规范化是否确保模板专用化<0>覆盖一般构造<N>,无论代码中的模板专用顺序是什么?

只是为了澄清术语,

template<int N> struct mystruct {float k = 3.14;};

不是专业化。它是主/泛型/基本实现。

只要专用化在使用mystruct<0>

时可见,只要使用专用化mystruct<0>就会使用专用化mystruct<0>。这就是专业化的全部意义所在。