[英]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] 采取非常不同的路徑。 也沒有任務
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.