我的编译器没有抱怨将const引用分配给临时引用:string foo() { return string("123");};int main() { const string& val = foo(); printf("%s\n", val.c_str()); return 0;}为什么?我以为从返回的字符串foo是临时的,而val可以指向生命周期已结束的对象。C ++标准是否允许这样做并延长返回对象的寿命?
2 回答
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
这是C ++功能。该代码是有效的,并且完全按照它的意图执行。
通常,临时对象仅持续到其出现的完整表达式的结尾。但是,C ++故意指定将临时对象绑定到堆栈上const的引用将引用的寿命延长到引用本身的寿命,从而避免了否则会导致常见的悬挂引用错误。在上面的示例中,临时属性由foo()
生命返回,直到大括号闭合为止。
PS:这仅适用于基于堆栈的引用。对于属于对象成员的引用不起作用。
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
是什么意思?在这种情况下,复制构造函数从来就不是 “必需的”。实际上,如果返回的return
表达式f()
返回未命名的rvalue,则RVO几乎肯定会加入进来并消除了副本构造,而是直接在调用者的接收位置(变量)构造返回的对象。如果return
表达式返回了一个命名对象,NRVO可能会做同样的事情。什么C ++ 17的保证复制省略实现是需要省音在RVO前,简单的情况。
- 2 回答
- 0 关注
- 615 浏览
添加回答
举报
0/150
提交
取消