C++模板 - 几个专业 - 行为是否定义?
C++ template - several specializations - is behaviour defined?
假设我声明了一个模板化结构:
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>
。这就是专业化的全部意义所在。
- 此递归模板类型定义是否有效C++?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 带有"struct structname<..>"的模板定义是否正确?
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 定义重载C++函数模板的原型时,使用其名称引用以前的定义是否合法?
- 命名空间的定义是否可以跨越多个翻译单元
- 头文件中的类声明和定义是否在每个包含上编译
- 这个无括号的C预处理器定义是否安全
- char的实现定义是否会影响std::string
- 对内联函数有不同的定义是否是一种未定义的行为
- 同一字符串的多个#定义是否使用相同的常量字符串
- 根据编译时常量,使用相同的标识符 #define 或类型定义是否被认为是可接受的做法?
- 显式模板实例化定义是否也抑制隐式实例化
- 构造函数定义是否可以以 "class" 关键字为前缀?
- 类中的函数定义是否占用类大小的一部分?
- 名称空间作用域构造函数定义是否需要类限定的标识符
- i=i++;未定义.是否i=foo(i++)也未定义
- "volatile"的定义是否如此不稳定,还是 GCC 存在一些标准合规性问题?