操作员临时重载

时间:2016-11-02 18:23:43

标签: c++ visual-c++ operator-overloading

我在尝试对方法返回的临时对象使用bitshift运算符时遇到了一些问题。

这个想法是创建一个Log对象作为临时对象,并通过bitshift运算符追加将存储在std :: stringstream对象中的值。

在销毁临时文件时,std :: stringstream会转储其内容,但是,在我追加第一个字符串之前,会调用析构函数。

一个小例子:

class LogEntry
{
public:
    LogEntry(int level) : m_level{level}
    {
    }

    ~LogEntry()
    {
        // dump m_out on destruction
        Widget(m_out.str());
    }

    template <typename T>
    LogEntry& operator<<(T& arg)
    {
        m_out << arg;

        return *this;
    }

private:
    std::stringstream m_out;
    const int m_level;
}

这就是我打算使用它的方式:

LogEntry(LOG_LEVEL_DEFAULT) << "This is a string" << 1234;

到目前为止,析构函数在bitshift运算符之前被调用,这意味着在将内容附加到m_out时内存已经被破坏。

有没有人知道如何确保在临时销毁之前调用操作符?

1 个答案:

答案 0 :(得分:4)

正如@hvd和@Richard Critten在评论中指出的那样,你的代码无法编译。如果您想要一个仅存在于语句中的临时变量,您可以在不给它命名的情况下这样做,例如:

LogEntry(LOG_LEVEL_DEFAULT) << "This is a string" << 1234;

如果这样做,将在调用析构函数之前调用这两个运算符。

但还有另一个问题。您的运算符&lt;&lt;(T&amp; arg)将左值引用作为输入,而1234不是左值。要解决第二个问题,您可以将运算符更改为通用引用的参数:operator&lt;&lt;(T&amp;&amp; arg)。