C++中引用临时对象是否合法?一段range-based for循环代码存疑
这段C++代码是否合法?
先给结论:这段代码在C++11及之后的标准里是完全合法的,能正常运行是符合规范的,你的理解偏差主要来自对几个概念的混淆,具体解释如下:
- 范围for循环里的
{"one", "two", "three", "four"}会被编译器隐式构造为一个const char*[4]类型的临时数组,根据C++标准,这个临时数组的生命周期会被延长至整个for循环的执行周期内,所以用auto&绑定数组中的元素是完全安全的,不会出现悬空引用的问题。 - 你之前误以为“字面量没有内存地址”是错误的:字符串字面量(比如
"one")属于静态存储期对象,会被存放在程序的只读数据段中,从程序启动到结束一直存在,本身就有固定的内存地址,并不是临时对象。 - 你看到的“取临时对象地址非法”的场景和这个完全不同:那种情况通常是指直接获取临时对象(比如临时创建的
std::string对象)的地址,临时对象在表达式结束后就会销毁,导致地址悬空。但你的代码里,临时数组的生命周期被范围for循环延长了,而且数组里的元素是指向静态字符串字面量的指针,两者都不会在循环过程中失效。
内容的提问来源于stack exchange,提问作者Dávid Tóth
相关产品推荐
相关产品推荐

