簡體   English   中英

C ++中的臨時對象

[英]Temporary objects in C++

我正在經歷參考返回,並且遇到了臨時對象。 我不知道如何識別它們。 請使用以下示例進行說明:

如果ab是同一類的對象,請考慮使用二元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 * cb * c的值並將它們存儲在某個位置-無法將它們存儲在abc 因此,生成的代碼等效於:

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.

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