簡體   English   中英

C ++積分常量表達式定義

[英]C++ integral constant expression definition

在當前的C ++標准中,有以下段落( expr.const#5 )(強調我的):

整數常量表達式是整數或未整數枚舉類型的表達式, 隱式轉換為prvalue ,其中轉換后的表達式是核心常量表達式。 [注意:這些表達式可以用作位字段長度,如果底層類型不固定([dcl.enum]),則可以用作枚舉器初始值設定項,也可以用作對齊方式。 - 結束說明]

關於這個定義,我有兩個問題:

  1. 短語“隱式轉換為prvalue”是否意味着對於表達式被視為“整數常量表達式”,它必須出現在強制它被隱式轉換為prvalue的上下文中?

  2. “轉換后的表達”是指什么? 我知道這個問題是在轉換常量表達式定義的澄清中解決的。 給出的答案是“轉換后的表達式”在下面的初始化之后是tT t = expr; 但是,我沒有看到如何評估表達式( t )是否與[expr.const#4]中給出的任何規則相匹配(描述表達式被視為核心常量表達式的必要條件的段落),這將使其不合格是一個核心的常數表達

謝謝。

該整數表達式隱式轉換為prvalue語句意味着左值到右值轉換應用於用作整數表達式中的任何表達。 在一種情況下,表達式可能是一個整型常量表達式 - 初始化可能在常量表達式中可用的const限定整數類型的非局部對象 - 無論如何初始化器都是prvalue,因此不會發生解釋的更改。

除此之外,你的兩個問題都有相同的答案:必須在核心常量表達式中允許將表達式(如所寫的)轉換為prvalue整數類型所需的任何轉換(例如,在引用之前參見/4.7)/ 6就在它之后)。 “轉換表達式”包括T t=e;的轉換T t=e; 解釋,而不僅僅是id-expression t (例如,它總是一個左值)。

我查看了clang的源代碼,特別是在“SemaOverload.cpp”中的“ CheckConvertedConstantExpression ”函數中。 在那里進行的操作如下:

  1. 找到所需的隱式轉換序列
  2. 檢查是否僅使用http://eel.is/c++draft/expr.const#7中列出的轉化次數
  3. 執行隱式轉換(在此步驟中我相信會創建一個新表達式,例如,如果原始表達式是f() ,它是類型A ,用戶定義的轉換函數為int,並且上下文需要一個int ,那么new表達式應該是f().operator int()
  4. 檢查是否需要縮小轉換次數
  5. 評估在步驟3中生成的表達式(隱式檢查它是否是constant expression

所以我相信,正如@Davis Herring的回答所述,術語“轉換表達”是指一種新的表達方式,其評估包括對程序中所寫的原始表達式的評估以及對任何所需轉換的評估。

暫無
暫無

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

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