![](/img/trans.png)
[英]The question about a glvalue constant expression used in a context that requires a constant expression
[英]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.