首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >临时操作符重载

问临时操作符重载
EN

Stack Overflow用户
提问于 2016-11-03 02:23:43
回答 1查看 345关注 0票数 1

我在一个方法返回的临时对象上使用位移运算符时遇到了一些问题。

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

在销毁临时对象时,std::stringstream将转储其内容,但是,在我可以附加第一个字符串之前,析构函数已被调用。

下面是一个小示例:

代码语言:javascript
复制
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;
}

这就是我打算如何使用它:

代码语言:javascript
复制
LogEntry(LOG_LEVEL_DEFAULT) << "This is a string" << 1234;

到目前为止,析构函数是在位移运算符之前调用的,这意味着在将内容追加到m_out时内存已经损坏。

有没有人知道如何确保在临时工被销毁之前接线员会被呼叫?

EN

回答 1

Stack Overflow用户

发布于 2016-11-03 02:35:56

正如@hvd和@Richard Critten在评论中指出的那样,您的代码不能编译。如果您想要一个仅存在于语句中的临时变量,则可以在不指定名称的情况下执行此操作,例如:

代码语言:javascript
复制
LogEntry(LOG_LEVEL_DEFAULT) << "This is a string" << 1234;

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40387151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档