问题:
临时对象的析构函数何时被调用?在函数调用中创建但不用作参数?具体来说,请考虑以下代码:
class StringBuffer { public: StringBuffer(std::string & str) : m_str(str) { m_buffer.push_back(0); } ~StringBuffer() { m_str = &m_buffer[0]; } char * Size(int maxlength) { m_buffer.resize(maxlength + 1, 0); return &m_buffer[0]; } private: std::string & m_str; std::vector<char> m_buffer; }; std::string mystring; GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
答案:
临时 StringBuffer 对象的析构函数在 调用 GetString 之后调用返回。
根据 C 标准(12.2 临时对象),临时对象的生命周期结束于完整表达式的末尾,即 (a) 本身不作为操作数出现在另一个完整表达式中(类对象的构造中除外),并且 (b) 不是 a 的一部分带括号的表达式。
在示例代码中,对 GetString 的调用是完整表达式,并且在该表达式中创建临时 StringBuffer 对象。因此,临时对象的生命周期在 GetString 调用返回后结束。
此生命周期保证确保临时对象保持有效,直到不再需要为止。它允许表达式模板保存对临时对象的引用,因为临时对象将持续到表达式被完全计算为止。
以上是函数调用中何时调用临时 C 对象的析构函数?的详细内容。更多信息请关注PHP中文网其他相关文章!