簡體   English   中英

如何將臨時對象作為非常量引用傳遞給成員函數?

[英]How do I pass a temporary object as a non-const reference into a member function?

我們正在創建一個旨在從當前模塊發送信息的類(具體內容與此問題無關)。 這種類型的對象被創建並填充有需要發送的部分數據,然后傳遞給(不同的類)成員函數。 該函數為對象提供其余數據,然后通過對象本身的調用觸發發送。 因為傳入的信息是動態的,所以目的是信息傳輸對象是一個臨時的,用最新的數據創建。 我們划出的設計在下面的蒸餾源代碼中,但是 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函數以接受對傳遞的XferInfo對象的右值引用(使用 double && ):

    void doSomething(const string& somethingParam, XferInfo&& xferInfo)
    {
        // complete data for xfer
        xferInfo.setCalleeInfo(somethingParam);
        // ... and so forth ...

從鏈接的 cppreference 頁面:

右值引用可用於延長臨時對象的生命周期(注意,對 const 的左值引用也可以延長臨時對象的生命周期,但不能通過它們修改)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM