通过构造函数隐式类类型转换创建的临时对象啥时候被销毁

Posted

技术标签:

【中文标题】通过构造函数隐式类类型转换创建的临时对象啥时候被销毁【英文标题】:when did the temporary object created by implicit class-type conversion through constructers get destroyed通过构造函数隐式类类型转换创建的临时对象什么时候被销毁 【发布时间】:2015-12-25 08:38:03 【问题描述】:

为了使描述更具体,请参见以下来自 C++ Primer 4th edition 的代码:

class Sales_item 
public:
    Sales_item(const std::string &book = "")
      : isbn(book), units_sold(0), revenue(0.0) 
    Sales_item(std::istream &is);
    //as before
 

Sales_item item;
item.same_isbn(cin);

书上说这段代码通过使用构造函数将cin隐式转换为Sales_item,构造函数创建一个(临时的)Sales_item对象通过读取标准输入。

那么,临时对象什么时候被销毁,在这种情况下使用隐式转换是否有害?

【问题讨论】:

离开Sales_item::same_isbn后的某个时间点。如果没有记错的话,C++ 标准对于确切的时刻有点模糊。除非您将对该对象的引用存储在 same_isbn 中(无论如何您都不应该这样做),否则没有问题。 取决于函数是否采用对象或引用。如果它需要引用,则临时对象至少会持续到 same_isbn 的执行结束。 same_isbn 是什么?您的代码示例应显示此 【参考方案1】:

一旦创建临时对象的完整表达式完成执行。在您的情况下,它是在完成最后一行之后。通常它是无害的,除非您试图保存对临时对象的指针/引用。

【讨论】:

感谢您的回答!

以上是关于通过构造函数隐式类类型转换创建的临时对象啥时候被销毁的主要内容,如果未能解决你的问题,请参考以下文章

Scala中的隐式转换|理解

隐式类类型转换以及如何避免隐式转换

基本语言

C++ 类的隐式转换

C++类与对象第四篇:(初始化列表构造匿名对象隐式类型转换友元static成员内部类)

java中的数据在啥时候可能会发生隐式转换?