[英]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.