簡體   English   中英

我應該采取什么步驟來確定表達式的值類別?

[英]What steps should I take to determine the value category of an expression?

我對確定表達式的值類別感到困惑。 您能否提供確定表達式值類別應采取的基本步驟(應分析什么)?

如果您只想獲得快速且通常正確的答案,請考慮以下經驗法則:

  • 如果它是一個函數或已經存在的對象,那么它就是一個glvalue。
    • 大多數glvalues是lvalues。
    • xvalues是可以專門從以下位置移動的事物:轉換為rvalue引用類型,或者其中函數返回類型為rvalue引用類型的函數調用(尤其是std::move有時還包括 std::forward )。
  • 如果這只是一個值或創建新對象的方式,那么它就是一個prvalue。

但在某些情況下,類別可能仍不清楚。 並且上面涉及一些簡化(特別是ABA ? B : C的規則更復雜)。

唯一真正可靠的方法是在標准中尋找答案。

  1. 確定您在語法方面的表達方式。 一個字面意思? 運算符表達式? 一個lambda? 等等。

  2. 如果表達式是運算符表達式,請找出重載解析是選擇某些重載運算符函數還是內置候選運算符,如[over.match.oper][over.oper][over.built]中所述。

  3. 如果表達式實際上是對重載運算符的調用,則值類別由重載解析選擇的運算符的返回類型確定,如[expr.call]中所述 在這種情況下,為此目的,請忽略對內置操作員行為的描述。

  4. 否則,請找到[expr.prim]或[expr.compound]的部分(請參閱目錄 )以獲取表達式的語法形式。 該部分將說明如何確定表達式的值類別。 經常需要知道任何子表達式的類型和值類別,因此您可能需要遞歸地遵循這些規則。

暫無
暫無

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

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