c++ - 什么时候临时用作命名对象的初始值设定项被销毁?

标签 c++ temporary-objects

在“The C++ Programming Language (3rd)”p.255:

A temporary can be used as an initializer for a const reference or a named object. For example:

void g(const string&, const string&);

void h(string& s1, string& s2)
{
   const string& s = s1+s2;
   string ss = s1+s2;

   g(s, ss);  // we can use s and ss here
}

This is fine. The temporary is destroyed when "its" reference or named object go out of scope.

他是说 s1+s2 创建的临时对象在 ss 超出范围时被销毁吗? 不是一复制初始化到ss就销毁了吗?

最佳答案

代码中唯一的临时变量是 s1 + s2。第一个绑定(bind)到 const-ref s,因此它的生命周期延长到 s。您的代码中没有其他内容是临时的。特别是,sss 都不是临时变量,因为它们显然是命名变量

第二个s1 + s2当然也是临时的,但它死在了行尾,只用于初始化ss

更新:也许有一点值得强调:在最后一行 g(s, ss); 中,重点是 s是一个完全有效的引用,并且它不是您可能期望的悬空引用,正是因为绑定(bind)到 const-references 的临时对象的生命周期延长规则。

关于c++ - 什么时候临时用作命名对象的初始值设定项被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242267/

相关文章:

c++ - SWIG 的 Python 包装器中临时对象的生命周期(?)

c++ - setlocale() 的线程安全方法

c++ - 在 C++ 中按大小为零分配内存?

c++ - 优先队列中的池内存分配

c++ - 在标准容器上执行一系列操作时最小化峰值内存使用

c++ - 使用 std::function 作为成员函数,它捕获 `this` ,并在析构函数后从复制的 lambda 访问它

c++ - 对结构成员的临时绑定(bind)引用

c++ - 如何列出用于在 Qt 项目中包含头文件的所有路径?

c++ - 检查标准输入是否为空

c++ - 构建 vector 时如何去除(一个)不必要的拷贝?