可以将平凡的整数常量变量始终用作模板值吗?
这个问题类似于这一个,但更具体的预C ++ 11种的情景。
我注意到使用 Clang 和 g++,以下编译器可以在 pre-c++11 中正常运行:
enum En { V0 = 0 };
template <int SZ> class C { };
template <En EN> class E { };
int main() {
const int SIZE = 42;
C<SIZE> c;
const int SIZE2 = SIZE ^ 0xDEADBEEF;
C<SIZE2> c2;
const En E1 = V0;
E<E1> e1;
}
在没有constexpr可用的上下文中,这样做非常方便,在某些情况下甚至可能是必要的。那么这是否保证有效,还是 g++ 和 Clang 只是为了方便而推断这些值?
回答
那么这是否保证有效
是的。从[expr.const] / 1 N1905(这是C ++ 03上下的标准版本):
5.19 常量表达式 [expr.const]
/1 在一些地方,C++ 需要计算为整数或枚举常量的表达式:作为数组边界 (8.3.4, 5.3.4),作为 case 表达式 (6.4.2),作为位域长度 (9.6),作为枚举器初始值设定项 (7.2),作为静态成员初始值设定项 (9.4.2),以及作为整数或枚举非类型模板参数(14.3)。
一个积分常数表达式可以只涉及算术类型(2.13,3.9.1),统计员,文字的非易失性常量变量或静态数据成员与常量表达式初始化积分或枚举类型的(8.5),
意味着所有的 const 变量SIZE, SIZE2and E1(因为它们已经用常量表达式初始化了)在整型常量表达式中是有效的,因此可以用作非类型模板参数的模板参数。