簡體   English   中英

glvalue積分常量表達式是一個常量表達式嗎?

[英]Is a glvalue integral constant expression a constant expression?

N4527 5.20 [expr.const] p3

整數常量表達式是整數或未整數枚舉類型的表達式,隱式轉換為prvalue,其中轉換后的表達式是核心常量表達式。

5.20 [expr.const] p5

常量表達式是glvalue核心常量表達式,其值指的是一個實體,它是常量表達式的允許結果(如下定義),或者是一個prvalue核心常量表達式,其值是一個對象,對於該對象及其子對象:

(5.1) - 引用類型的每個非靜態數據成員是指一個實體,它是一個常量表達式的允許結果,和

(5.2) - 如果對象或子對象是指針類型,則它包含具有靜態存儲持續時間的對象的地址,超出此類對象結尾的地址(5.7),函數的地址或空指針值。

如果實體是具有靜態存儲持續時間的對象,則該實體是常量表達式的允許結果,該對象不是臨時對象,或者是其值滿足上述約束的臨時對象,或者它是函數。

void foo(){
    const int a = 1;//a has automatic storage duration
    // all ok in gcc 5.1.0 and clang 3.8.0
    int b[a]{};
    static_assert(a,"");
    switch(1){
      case a:
        ;
    }
}

問題1:是a 整數常數表達式嗎?

問題2:是a 常量表達式

問題3:glvalue積分常量表達式是一個常量表達式嗎?

問題4:

如果問題3的答案是肯定的,如果對象具有自動存儲持續時間,這是否與5.20 p3沖突?

a積分常數表達式嗎?

在以下情況中:

int b[a]{};
static_assert(a,"");
switch(1){
  case a:
    ;
}

是的, a是一個整數常量表達式。 從您的第一個報價開始:

整數常量表達式是整數或未整數枚舉類型的表達式,隱式轉換為prvalue,其中轉換后的表達式是核心常量表達式。

“A”是一個完整的類型,在你的情況下,它會被隱式轉換為prvalue,所以現在是a核心常量表達式? 是的,如果我們回到第2段,它定義了什么不是核心常量表達式:

條件表達式e是核心常量表達式,除非根據抽象機器(1.9)的規則評估e將評估以下表達式之一

它有以下條款:

除非適用,否則左值到右值的轉換(4.1)

除以下異常:

一個非整數或枚舉類型的非易失性glvalue,它引用一個完整的非易失性const對象,具有前面的初始化,用常量表達式初始化,或者

適用於a因為它是非易失性的,const並用常量表達式初始化。


a常量表達式?

在與上述相同的上下文中,是的,因為我們可以從上面的引文中看到它是一個核心常量表達式。


glvalue積分常量表達式是一個常量表達式嗎?

不,為了使它成為一個整數常量表達式,它必須轉換為prvalue,因此不能成為glvalue。

暫無
暫無

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

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