关于c++模板非类型参数中指针和引用类型必须为全局或者静态变量的问题
之前在学习c++模板的时候,一直没留意到在非类型参数中对指针和引用有着一些限制,今早在复学模板的时候才注意到书上标明,指针和引用作为模板的非类型参数传递时必须要求是全局或者静态变量。其实不难想到,模板参数是在预编译期间进行传递并被编译的,所以对于非类型参数来说,必须是常量,也就是说,对于指针和引用,它们在整个进程生命周期内,必须有着唯一一个且永久有效的线性地址,所以也就要求指针和引用表示的变量必须是全局或者静态变量。
但因为离开学校太久,对编译原理的一些知识已经淡忘,依稀记得无论全局变量还是局部变量,在编译时期就已经确定好偏移地址,那为什么全局变量就可以得出唯一线性地址,而局部变量就不行呢?趁着中午回去休息的时候赶紧翻了翻课本,才发现疑惑出现在了这个偏移地址的对象上。全局(静态)变量的偏移地址是对于数据段的偏移;而局部变量的偏移地址,是对于当前执行栈底的偏移,程序在执行函数的时候给这个函数分配一个栈,栈底的逻辑地址在这个时候才会确定,加上偏移量(负数,虚拟内存中栈从0xC0000 0000往下分配)得出当前逻辑地址。所以,这就是为什么全局变量可以拥有唯一线性地址,而局部变量不行的原因,再回到模板上面,局部变量的指针和引用不能作为非类型参数的类型占位符就说的过去了。
关于c++模板非类型参数中指针和引用类型必须为全局或者静态变量的问题的更多相关文章
- Java中静态变量与非静态变量的区别
感谢大佬:https://www.cnblogs.com/liuhuijie/p/9175167.html ①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 ...
- Spring/Spring boot中静态变量赋值
情形1:静态变量为自动注入的对象 解决方案:设置两个变量,非静态变量使用@resource注入Bean,然后使用@PostConstruct在Spring初始化Bean成功后为静态变量赋值 @Comp ...
- Java中读取配置文件中的内容,并将其赋值给静态变量的方法
应用场景 项目开发中某个功能需要抽取成方法写成一个工具类,提供给别人使用.写过工具类的人都知道,工具类中的方法一般都是静态方法,可以直接使用类名点方法名调用, 使用很方便,比如判断某个对象是否为空的方 ...
- android中少用静态变量(android静态变量static生命周期)
在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. ...
- java中静态变量与静态方法的继承(转)
总结: 1.静态变量与静态方法说继承并不确切,静态方法与变量是属于类的方法与变量.而子类也属于超类,比如说Manage extends Employee,则Manage也是一个Employee,所以子 ...
- static静态变量在c++类中的应用实例
这个static 如果写在类中,那么就可以得到一个局部的静态变量,也就是说可以实现在类内保存某个特殊值不随函数释放而消失的作用.应用中由于赋初值的位置不对而报错,错误提示为:“无法解析外部符号 ... ...
- C++语言基础(20)-模板的非类型参数
一.在函数模板中使用非类型参数 #include <iostream> using namespace std; template<class T> void Swap(T & ...
- scala学习笔记-类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
转载自 fineqtbull http://fineqtbull.iteye.com/blog/477994 有位je上的同学来短信向我问起了Scala类型参数中协变.逆变.类型上界和类型下界的 ...
- Scala类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
转自:http://fineqtbull.iteye.com/blog/477994#bc2364938 有位je上的同学来短信向我问起了Scala类型参数中协变.逆变.类型上界和类型下界的使用方法和 ...
随机推荐
- VM 虚拟机 CentOS 7 设置 桥接网络
桥接网络的设置: 安装时设置网络为桥接网络! 找到 ip 地址,设置如下 注意ip地址并不是一样的,用以区分 然后在关闭 windows 防火墙,打开 cmd 使用 ping 命令 O ...
- 前端武器库之DOM练习
1.模态对话框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'
code: 将 Stu* pStu = malloc(sizeof(Stu)); 改为Stu* pStu = (Stu*)malloc(sizeof(Stu)); code #include < ...
- base/7/x86_64/filelists_db FAILED
解决办法: [root@localhost ~]# cd /var/lib/rpm [root@localhost rpm]# rm -rf __db.* # 清除原 rpmdb 文件 [root ...
- sftp远程传输脚本
该脚本主要是是批量修改文件名,然后传输文件到服务器#!/bin/bash #脚本名:sftp.sh while true do num=`cat test.txt|wc -l` ;a<=$num ...
- ICEM-缺角正方体
原视频下载地址:https://yunpan.cn/cqKwGiMRiqN7I 访问密码 3377
- ArcGIS数据建模 (模型构建器modelbuilder) 培训视频 5章28小节587分钟视频 51GIS网站上线
网址:http://www.51gis.com.cn/kecheng.html?id=358
- OpenJudge计算概论-找出第k大的数
/*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...
- NetHogs监控Linux的每个进程流量
在日常运维环境中,我们肯定会遇到以下这种需求: 1.网络流量异常,不知道是哪个程序的流量爆涨? 2.日常需要监控网络实时的流量进去数据 面试装逼系列|这篇文章,让运维监控不再成为你的短板! 学会这 1 ...
- WGS84 2 GCJ-02
#include ; ) { x=-x; ff=; } cc=) ff=; ) ff=; } x=tt; ss=x; s2=x; tt=tt*tt; s2=s2*tt; ss=ss-s2* ) ss= ...