C++模板参数有哪些要求?

jef*_*ffD 8 c++ parameters templates const extern

如果您在C++中使用以整数值作为参数的模板,那么对于用作参数的整数变量是否有任何要求,如果该变量在函数调用中用作参数?

这是一个后续问题 在这里.如果WRT变量声明为函数或模板的"extern const int",我特别想解决这个问题吗?

我可以看到,对于某些模板情况,编译时需要参数值.这总是如此吗?有没有办法指定(可能仅用于参数值的某些用途)该值是否在运行时使用?

mwe*_*den 13

以下是标准.

14.3.2.1:

非类型非模板模板参数的模板参数应为以下之一:

  • 积分或枚举类型的整数常量表达式; 要么
  • 非类型模板参数的名称; 要么
  • 具有外部链接的对象或函数的地址,包括函数模板和函数template-id,但不包括非静态类成员,表示为&id-expression,其中&是可选的,如果名称引用函数或数组,或者如果相应的模板参数是参考; 要么
  • 指向成员的指针,如5.3.1中所述.

5.19.1:

在一些地方,C++要求表达式计算为整数或枚举常量:作为数组边界(8.3.4,5.3.4),作为案例表达式(6.4.2),作为位字段长度(9.6),作为枚举器初始化器(7.2),作为静态成员初始值设定项(9.4.2),以及作为整数或枚举非类型模板参数(14.3).

 constant-expression:
            conditional-expression
Run Code Online (Sandbox Code Playgroud)

整数常量表达式只能包含文字(2.13),枚举器,常量变量或使用常量表达式(8.5)初始化的整数或枚举类型的静态数据成员,整数或枚举类型的非类型模板参数以及sizeof表达式.浮动文字(2.13.3)只有在转换为整数或枚举类型时才会出现.只能使用转换为积分或枚举类型的转换.特别是,除了sizeof表达式之外,不应使用函数,类对象,指针或引用,并且不应使用赋值,递增,递减,函数调用或逗号运算符.

关于你以前的帖子,我相信"const变量...... 用...... 初始化 "部分的本质(我不认为初始化外部计数).


Ecl*_*pse 3

编译时总是需要 int 的值。

由于每个模板实例化都是一段单独的编译代码(即使对于整数模板参数也是如此),因此整数在编译时需要可用(并且必须保证永远不会更改)。

这也是为什么当您要使用大量唯一值时最好不要使用整数模板参数 - 您很快就会得到一个巨大的可执行文件。