关于c++模板非类型参数中指针和引用类型必须为全局或者静态变量的问题

  之前在学习c++模板的时候,一直没留意到在非类型参数中对指针和引用有着一些限制,今早在复学模板的时候才注意到书上标明,指针和引用作为模板的非类型参数传递时必须要求是全局或者静态变量。其实不难想到,模板参数是在预编译期间进行传递并被编译的,所以对于非类型参数来说,必须是常量,也就是说,对于指针和引用,它们在整个进程生命周期内,必须有着唯一一个且永久有效的线性地址,所以也就要求指针和引用表示的变量必须是全局或者静态变量。

  但又依稀记得无论全局变量还是局部变量,在编译时期就已经确定好偏移地址,那为什么全局变量就可以得出唯一线性地址,而局部变量就不行呢?趁着中午回去休息的时候赶紧翻了翻课本,才发现疑惑出现在了这个偏移地址的对象上。全局(静态)变量的偏移地址是对于数据段的偏移;而局部变量的偏移地址,是对于当前执行栈底的偏移,程序在执行函数的时候给这个函数分配一个栈,栈底的逻辑地址在这个时候才会确定,加上偏移量(负数,虚拟内存中栈从0xC0000 0000往下分配)得出当前逻辑地址。所以,这就是为什么全局变量可以拥有唯一线性地址,而局部变量不行的原因,再回到模板上面,局部变量的指针和引用不能作为非类型参数的类型占位符就说的过去了。

 

posted @ 2019-08-07 12:00  我的超级帅发型丶  阅读(664)  评论(0编辑  收藏  举报