为什么作为非类型参数传递的参数应该是全局的而不是本地的?是否仅在编译期间创建和分配内存?
在这种情况下,p是一个const指针,所以它不能指向任何其他变量,然后它也会给出错误。为什么?
template<int* ptr>
class A{};
int x;
int *const p = &x;
int main() {
x = 9;
A<&x> ob;
A<p> ob2;//giving error
cin.get();
}
另外为什么只允许整数类型作为非类型参数,而不是char或float?
答案 0 :(得分:3)
关于第一个问题,我不是编译专家,但我猜它可以使编译器的生活更轻松,也许这是来自旧版C ++的限制,其中constexpr
不可用。
尽管如此,C ++ 11标准的第14.3.2 / 1段对于允许的内容和不允许的内容非常清楚:
非类型非模板模板参数的模板参数应为以下之一:
- 对于整数或枚举类型的非类型模板参数,转换的常量表达式 (5.19)模板参数的类型;或
- 非类型模板参数的名称;或
- 一个常量表达式(5.19),用于指定具有静态存储持续时间的对象的地址 外部或内部链接或具有外部或内部链接的功能,包括功能模板 和函数template-ids但不包括非静态类成员,表示(忽略括号)为 &安培; id-expression ,除了&amp;如果名称引用函数或数组,则可以省略 如果相应的模板参数是引用,则省略;或
- 一个求值为空指针值的常量表达式(4.10);或
- 一个求值为空成员指针值的常量表达式(4.11);或
- 指向成员的指针,如5.3.1所述;或
- std :: nullptr_t类型的地址常量表达式。
关于您的第二个问题,允许char
。例如,以下是法律程序:
template<char c>
struct X
{
// ...
};
int main()
{
X<'c'> x;
}
关于不允许使用浮点类型的原因,您可以在this Q&A on StackOverflow中找到一些信息。