これは、別の質問に与えられた短い回答と、それに関連する C++11 標準のいくつかの側面について、より完全な説明を求めているという点で、おそらく少し変わった質問です。
参照しやすいように、ここで参照されている質問を要約します。OP はクラスを定義します。
struct Account
{
static constexpr int period = 30;
void foo(const int &) { }
void bar() { foo(period); } //no error?
};
また、クラス内で初期化された静的データ メンバーの使用についてエラーが発生しないのはなぜだろうと考えています (ある本では、これは違法であると述べられています)。Johannes Schaubの答えは、次のように述べています。
- これは、 One Definition Ruleに違反しています。
- 診断は必要ありません。
この回答のソースと有効性に依存している限り、私は個人的にそれが難解すぎると感じているため、正直に嫌いです. 関連するのは § 9.4.2/4 のようです:
「プログラムには、 odr で使用される(3.2)静的データ メンバーの定義が 1 つだけ存在する必要があります。診断は必要ありません」 [強調は私のものです]
これにより、ポイントに少し近づきます。そして、これは § 3.2/2 がどのようにodr で使用される変数を定義するかです:
「潜在的に評価される式として現れる名前を持つ変数は、それが定数式 (5.19) に現れるための要件を満たし、左辺値から右辺値への変換 (4.1) がすぐに適用されるオブジェクトでない限り、odr 使用されます」 [強調は私のものです]
OPの質問では、変数は変数period
である定数式に現れるための要件を明確に満たしていconstexpr
ます。したがって、理由は確実に2 番目の条件にあるはずです: "そして、左辺値から右辺値への変換 (4.1) はすぐに適用されます"。
これは、標準の解釈に問題があるところです。この 2 番目の条件は、実際には何を意味するのでしょうか。それがカバーする状況は何ですか?関数から返された場合、静的constexpr
変数はodrで使用されない(したがって、クラス内で初期化できる)ということですか?
より一般的には、クラス内で初期化できるように、静的変数で何をすることが許可されていますか?constexpr