簡體   English   中英

構造的臨時對象是左值嗎?

[英]Constructed temporary object are lvalue?

假設我有一個名為Foo的類,帶有復制賦值運算符,我認為這是:

Foo() = Foo();

不允許,因為我(再次抱歉)認為Foo()是一個右值(因此我無法分配給它),是一個臨時對象。 顯然,我試圖使此代碼正常工作,並正常工作,顯示一些字符串以驗證我的程序正確使用了復制分配運算符。

我錯了嗎? 還是這是一個錯誤? 可以有什么用?

Foo()是一個右值,這是肯定的。

但是表達式Foo() = Foo()等效於Foo().operator=(Foo()) 即使Foo()是一個右值,仍然允許您在其上調用成員函數,甚至是對其進行修改的成員函數。

當然,分配的左側不允許使用基本類型的右值。 在這方面,基本類型與用戶定義的類型不同。

這就是為什么在C ++中,不應將“左值”定義為“可能出現在作業左側的東西”!

Foo具有重載的副本分配/移動分配運算符。 要么隱式提供一個,要么您自己編寫。 無論哪種方式,由於Foo()是一個實例,因此它能夠像常規成員函數一樣訪問成員函數運算符。

您說對了=運算符通常要求其左操作數為左值。 但是,當將運算符應用於對其已重載的類型時,它們將轉換為函數調用。 您的代碼等效於:

Foo().operator=(Foo())

. 運算符會很樂意接受一個右值作為其左操作數。

一個對象不能是“ rvalue”或“ lvalue”。 如果不同類型的值(lvalue,rvalue,xvalue,prvalue等)適用於表達式 ,則該概念適用於訪問對象,而不是對象本身。

在您的情況下,函數強制轉換表達式Foo()確實會產生一個臨時對象作為右值。 但是,在該臨時對象的任何方法中,您都可以使用表達式*this ,它將把與之相同的臨時對象顯示為左值。 換句話說,普遍認為臨時對象是右值是不正確的。 始終取決於您使用哪種表達式來訪問對象。

您可以在作業的左側使用它,這沒有什么不尋常的。 “左值”要求僅適用於內置賦值運算符。 對於重載的賦值運算符,沒有這樣的要求,也從來沒有過。 在您的情況下,您正在使用重載運算符。

暫無
暫無

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

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