C++ 是否为在函数调用中创建但不用作参数的临时变量的生命周期提供保证?这是一个示例类:
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;
};
以下是您将如何使用它:
// this is from a crusty old API that can't be changed
void GetString(char * str, int maxlength);
std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
什么时候会调用临时 StringBuffer 对象的析构函数?是吗:
- 在调用 GetString 之前?
- GetString 返回后?
- 编译器依赖?
我知道 C++ 保证本地临时变量只要有对它的引用就有效 - 当有对成员变量的引用时,这是否适用于父对象?
谢谢。
原文由 Mark Ransom 发布,翻译遵循 CC BY-SA 4.0 许可协议
这种临时对象的析构函数在完整表达式的末尾被调用。这是最外层的表达式,不属于任何其他表达式。这是在函数返回并评估值之后的情况。所以,一切都会很好。
这实际上是使表达式模板起作用的原因:它们可以在表达式中保留对此类临时对象的引用,例如
因为每个临时的都会持续到表达式
被完全评估。在标准中的
12.2 Temporary objects
中对其进行了非常简洁的描述。