为什么模板非类型参数指针和引用参数需要是全局的

时间:2013-05-23 10:14:46

标签: c++ templates global local non-type

为什么作为非类型参数传递的参数应该是全局的而不是本地的?是否仅在编译期间创建和分配内存?

在这种情况下,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?

1 个答案:

答案 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中找到一些信息。