簡體   English   中英

臨時物化和 xvalue 表達式

[英]Temporary materialization and xvalue expression

cppreference 表示:任何在臨時物化后指定臨時 object 的表達式都是 xvalue 表達式(C++17 起)

臨時物化是

任何完整類型 T 的純右值都可以轉換為相同類型 T 的虛值。此轉換通過用臨時值 object 評估純右值作為其結果 object 來從純右值初始化類型 T 的臨時值 object,並生成表示臨時object。

我懷疑我不理解的是,從這個引用中,臨時物化轉換(prvalue->xvalue)產生一個表示臨時 object 的 xvalue。為了澄清我不完全理解的內容,我將提供一個簡單的例子:

const T& t = T(); 

引用t綁定到 prvalue T() 因此,從這個純右值創建並初始化了一個T類型的臨時對象; 那么引用將綁定到那個臨時的。 我認為臨時文件看起來像這樣:並且t引用將綁定到它:

T __tmp{ };
const T& t = __tmp; 

事實上,上面兩行是隱式發生的,但總的來說,我可以說賦值const T& t = __tmp;中的表達式__tmp ; 是 xvalue 表達式?

直到現在我假設我是真的,如果不是,那么 cppreference 是什么意思“任何指定臨時 object 的表達式,在臨時物化之后是 xvalue 表達式”? 現在 xvalue 表達式在哪里? 在這種情況下,"指定"一詞是什么意思?

當編譯器轉換const T& t = T(); 進入 AST,它看起來大致是這樣的:

`-DeclarationStatement
  `-VariableDeclaration (name: t, type: const T&)
    `-InitializerExpr (type: const T, category: glvalue)
      `-MaterializeTemporaryExpr (type: const T, category: xvalue) [conv.rval]
        `-ImplicitCastExpr (type: const T, category: prvalue) [dcl.init.ref#5.3]
          `-ExplicitCastExpr (type: T, category: prvalue) [expr.type.conv]

(ImplicitCastExpr 來自dcl.init.ref#5.3.sentence-2中的“調整為”一詞)

所以要回答

現在 xvalue 表達式在哪里?

它是語法樹上的MaterializeTemporaryExpr C++ 中有許多這樣的隱式轉換(甚至在 C 中,例如考慮1.2/2的 AST

我可以說賦值const T& t = __tmp;中的表達式__tmp ; 是 xvalue 表達式

不; 這是每個expr.prim.id的左值,因此它通過 [dcl.init.ref] 采取非常不同的路徑。 也沒有任務

我可以說賦值const T& t = __tmp;中的表達式__tmp ; 是 xvalue 表達式?

最好說您顯示為等效的代碼是不正確的,因為它不包括 xvalue 轉換步驟。 更准確的版本是:

T __tmp{ };
const T& t = std::move(__tmp);

std::move強制轉換導致一個 xvalue 表達式引用 object __tmp

在這種情況下,"指定"一詞是什么意思?

它在其他情況下的含義相同。 它沒有被用作特殊術語。 就是“指定”二字:標出或指出; 表明; 展示; 指定. 表達式T()指示/顯示/指定特定的 object。

暫無
暫無

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

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