c++ - 如何将临时对象作为非常量引用传递给成员函数?

标签 c++ gcc pass-by-reference temporary-objects lvalue-to-rvalue

我们正在创建一个旨在从当前模块发送信息的类(细节与这个问题无关)。这种类型的对象被创建并填充了需要发送的部分数据,然后传递给(不同的类)成员函数。该函数为对象提供其余数据,然后通过对象本身的调用触发发送。因为传入的信息是动态的,所以信息传输对象是一个临时对象,是用最新数据创建的。我们列出的设计在下面的精炼源代码中,但 gcc/C++ 不允许这样做,并给出显示的错误。

问题是,我们如何使用可以被调用函数修改和使用的临时对象(避免内存泄漏)来完成预期的行为?

gcc 编译器错误:

infoxfer.cpp: In function ‘int main()’:
infoxfer.cpp:54:43: error: cannot bind non-const lvalue reference of type ‘XferInfo&’ to an rvalue of type ‘XferInfo’
   51 |     callee.doSomething("Something param", XferInfo("from main()"));
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~
infoxfer.cpp:36:62: note:   initializing argument 2 of ‘void Callee::doSomething(const string&, XferInfo&)’
   33 |     void doSomething(const string& somethingParam, XferInfo& xferInfo)
      |                                                    ~~~~~~~~~~^~~~~~~~
蒸馏的示例代码:
infoxfer.cpp:
#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

class XferInfo
{
private:
    const string mCallerInfo;
    string mCalleeInfo;

public:
    XferInfo(const string& callerInfo) : mCallerInfo(callerInfo)
    {}

    void setCalleeInfo(const string& calleeInfo)
    {
        mCalleeInfo = calleeInfo;
    }

    void sendData()
    {
        // simulate sending data
        cout << mCallerInfo << " | " << mCalleeInfo << endl;
    }
};

class Callee
{
public:
    void doSomething(const string& somethingParam, XferInfo& xferInfo)
    {
        // complete data for xfer
        xferInfo.setCalleeInfo(somethingParam);

        // simulate doing something
        cout << "do something" << endl;

        // send the complete info
        xferInfo.sendData();
    }
};

int main()
{
    cout << "start" << endl;

    Callee callee;
    callee.doSomething("Something param", XferInfo("from main()"));

    cout << "end" << endl;

    return 0;
}

最佳答案

如评论中所述,您可以简单地更改您的 doSomething接受 rvalue reference 的函数给通过的XferInfo对象(使用双 && ):

    void doSomething(const string& somethingParam, XferInfo&& xferInfo)
    {
        // complete data for xfer
        xferInfo.setCalleeInfo(somethingParam);
        // ... and so forth ...
从链接的 cppreference 页面:

Rvalue references can be used to extend the lifetimes of temporary objects (note, lvalue references to const can extend the lifetimes of temporary objects too, but they are not modifiable through them)

关于c++ - 如何将临时对象作为非常量引用传递给成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64504534/

相关文章:

c++ - class::data_member 与 class_object.data_member

java - 使用GCC编译Java文件时出错

c++ - C++ 中的模板特化

c++ - 我怎样才能改进这个对象的实例化方式?

c - 为什么ld无法从/etc/ld.so.conf中的路径找到库?

c - m68k-elf 目标是否支持 GCC 内联 asm goto?

php - 为什么不推荐在 PHP 中通过引用调用函数?

c++ - 模板按值传递或 const 引用或...?

C中按值调用

c++ - 如何更改元素中间的文本样式