N4527 5.20[expr.const]p5
定数式は、値が定数式 (以下で定義) の許可された結果であるエンティティを参照する glvalue コア定数式、または値がオブジェクトである prvalue コア定数式のいずれかです。 :
— 参照型の各非静的データ メンバーは、定数式の許可された結果であるエンティティを参照します。
— オブジェクトまたはサブオブジェクトがポインター型の場合、静的ストレージ期間を持つオブジェクトのアドレス、そのようなオブジェクトの末尾を過ぎたアドレス (5.7)、関数のアドレス、または null ポインター値が含まれます。
エンティティは、それが一時オブジェクトではないか、値が上記の制約を満たす一時オブジェクトである静的ストレージ期間を持つオブジェクトである場合、または関数である場合、定数式の許可された結果です。
void foo(){
int a = 1;
int b[a || 1]{};//ok in gcc 5.1.0, error in clang 3.8.0
static_assert(a || 1,"");//ok in gcc 5.1.0, error in clang 3.8.0
switch(1){
case a || 1://ok in gcc 5.1.0, error in clang 3.8.0
;
}
}
a || 1
定数式ですか?
N4527 5.20[expr.const]p2
条件式 e は、抽象マシン (1.9) の規則に従って e を評価した場合に、次の式のいずれかが評価されない限り、コア定数式です。
(2.7) — 適用されない限り、左辺値から右辺値への変換 (4.1)
(2.7.1) — 定数式で初期化された、前に初期化された完全な不揮発性 const オブジェクトを参照する、整数型または列挙型の不揮発性 glvalue、または
(2.7.2) — 文字列リテラルのサブオブジェクトを参照する不揮発性の glvalue (2.13.5)、または
(2.7.3) — constexpr で定義された不揮発性オブジェクトを参照する、またはそのようなオブジェクトの可変でないサブオブジェクトを参照する、非揮発性の glvalue、または
(2.7.4) — 有効期間が e の評価内で始まる不揮発性オブジェクトを参照する、リテラル型の不揮発性 glvalue。
コア定数式ですかa || 1
?