[英]Temporary objects in C++
我正在經歷參考返回,並且遇到了臨時對象。 我不知道如何識別它們。 請使用以下示例進行說明:
如果a
和b
是同一類的對象,請考慮使用二元operator+
。 如果在表達式f(a+b)
使用它,則a+b
成為臨時對象,並且f
的形式必須為f(const <class name>&)
或f(<class name>)
。 它的形式不能為f(<class name>&)
但是, (a+b).g()
完全可以,其中g()
甚至可以更改a+b
返回的對象的內容。
當您說f(a + b)
, f
的參數需要綁定到調用該函數的值,並且由於該值是一個右值(即具有非引用返回類型的函數調用的值)* ,參數類型必須是const-lvalue-reference,rvalue-reference或非引用。
相比之下,當您說(a + b).g()
,臨時對象用作成員函數調用中的隱式實例參數,該成員函數並不關心值類別。 可變值綁定到非const和const成員函數,而const值僅綁定到const成員函數(對於volatile
)。
實際上,C ++ 11 確實添加了一種方法來限定隱式實例參數的值類別,如下所示:
struct Foo()
{
Foo operator+(Foo const & lhs, Foo const & rhs);
void g() &; // #1, instance must be an lvalue
void g() &&; // #2, instance must be an rvalue
}
Foo a, b;
a.g(); // calls #1
b.g(); // calls #1
(a + b).g(); // calls #2
*)在此示例中,重載運算符和內置二進制運算符都是如此。 當然,您可以使產生左值的重載運算符,盡管違反通用約定可能會被認為非常混亂。
造成混淆的原因不是無法識別臨時對象,在兩種情況下a+b
結果都是臨時對象,而是錯誤地假設non const方法需要左值並且不接受臨時對象,這是不正確的。
對於簡單的情況,請考慮以下代碼:
int func(int lhs, int rhs)
{
return lhs + rhs;
}
int main() {
int a = 1, b = 2, c = 3;
return func(a * c, b * c);
}
由於func接受兩個整數,因此程序必須計算a * c
和b * c
的值並將它們存儲在某個位置-無法將它們存儲在a
或b
或c
。 因此,生成的代碼等效於:
int lhsParam = a * c;
int rhsParam = b * c;
return func(lhsParam, rhsParam);
同樣,在func()
的末尾,我們返回一個計算值lhs + rhs
。 編譯器必須將其存儲在新位置。
對於整數等等,這似乎非常簡單,但請考慮
int function(std::string filename);
function("hello");
filename
必須是std::string
,但是您傳遞了const char*
。 因此,編譯器要做的是:
std::string filenameParam = "hello"; // construct a new object
function(filenameParam);
就像前面的示例一樣,但是這次希望我們可以清楚地構造一個臨時對象。
注意:稱呼它們為“ somethingParam”的約定只是為了使此答案更清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.