c++ - 在 C++ 中保证临时的生命周期?

标签 c++

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++ 保证本地临时变量只要有对它的引用就有效 - 当有对成员变量的引用时,这是否适用于父对象?

谢谢。

最佳答案

这种临时对象的析构函数在完整表达式的末尾被调用。这是最外层的表达式,不属于任何其他表达式。这是在函数返回并评估值之后的情况。所以,一切都会很好。

这实际上是使表达式模板起作用的原因:它们可以在表达式中保留对此类临时对象的引用,例如

e = a + b * c / d

因为每个临时的都会持续到表达式

x = y

已完全评估。标准中的12.2 Temporary objects中有相当简洁的描述。

关于c++ - 在 C++ 中保证临时的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584824/

相关文章:

c++ - 升压.Lambda : Insert into a different data structure

c++ - 以另一个用户身份运行程序

c++ - 为什么 decltype 看不到成员声明?

C++ 使用 std::bitset 组合哈希函数

c++ - C++ 98 中的部分模板特化?

c++ - 如何正确解析传入的 HTTP 请求

使用抽象基类的 C++ "Pure virtual method called"

c++ - 无法从 C++ vector 中按索引删除项目

c++ - 如何初始化 CUDA 以便我可以进行有效的执行时间测量?

c++ - 处理错误的 ifstream