標準に従って、Clangはコードを拒否することができます。
t2.m
は、クラスメンバーアクセス式です。 [expr.ref]/1は言う:ノートもあります
[...] The postfix expression before the dot or arrow is evaluated; the result of that evaluation, together with the id-expression, determines the result of the entire postfix expression.
:
If the class member access expression is evaluated, the subexpression evaluation happens even if the result is unnecessary to determine the value of the entire postfix expression, for example if the id-expression denotes a static member.
だから、部分式t2
が評価されます。 【expr.const] /2.9発現e
はそう、それを評価すること
an id-expression that refers to a variable or data member of reference type unless the reference has a preceding initialization and either
- it is initialized with a constant expression or
- its lifetime began within the evaluation of
e
;
t2
の評価になる場合、コア定数式で弾丸を満たさない参照型の変数を参照することができないと言いますt2.m
はコア定数式ではないため、定数式ではありません。
N4594、現在公表ワーキングドラフトからのすべての引用符。テキストはC++ 11以降わずかに変更されていますが、この場合の意味は同じです。
(非公開列挙体がクラスメンバである場合、その列挙子はクラスメンバアクセス演算子 '.'を使用してアクセスできます。と ' - >' "です。それは定数表現であることについて何も言及していない。 –
@JoachimPileborg標準 '§7.2.2'では、' 列挙子リスト内の識別子は定数として宣言され、定数が必要な場所には表示されます。 ' – lcs