C++模板 - 几个特化 - 是行为定义的吗?

Ben*_*ois 3 c++ templates template-specialization

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

template <int N> struct mystruct;
Run Code Online (Sandbox Code Playgroud)

让我们假设我的结构对所有人都有一般行为N,除非是N == 0

我可以声明一个特殊的行为N == 0:

template<> struct mystruct<0> {int k = 0};
Run Code Online (Sandbox Code Playgroud)

我也可以用以下方式声明一般行为:

template<int N> struct mystruct {float k = 3.14;};
Run Code Online (Sandbox Code Playgroud)

如果我在主要运行:

struct mystruct<-1> x;
struct mystruct<0> y;
struct mystruct<1> z;
std::cout << x.k << " " << y.k << " " << z.k << std::endl;
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的东西:3.14 0 3.14无论模板声明的顺序如何.

但是我想知道这种行为是否有保险.的确,当我宣布:

struct mystruct<0> y;

在我看来,这也可以通过两种mystruct实现来定义.

所以问题是:

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

Sto*_*ica 5

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

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

为函数模板,类模板,变量模板,类模板的成员函数,类模板的静态数据成员,类模板的成员类,类模板的成员枚举,类模板的成员类模板,成员函数放置显式特化声明类模板的模板,类模板的静态数据成员模板,类模板的成员模板的成员函数,非模板类的成员模板的成员函数,非模板类的静态数据成员模板,成员类的成员函数模板类模板等,以及类模板,变量模板,非模板类的成员类模板,非模板类的静态数据成员模板,类模板的成员类模板等的部分特化声明的放置,可以根据显式specia的相对位置来影响程序是否格式正确 翻译单元中的lization声明及其实例化点,如上下文所述.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.

  • @PeteBecker好吧,阅读不同模板类型的完整列表是相当艰巨的(我在一段时间后停止计算"模板"的外观......).不希望OP错过这一点.是的,这是一个很棒的报价.有一天,他很想在答案中使用它.物品列表清单. (3认同)
  • 不会期望在C++标准中看到幽默:) (2认同)
  • 那么什么可能导致我的例子的上下文中的未定义行为? (2认同)