非静的メンバーを禁止するための規則は、7.1.6.4節4にあります。
自動型指定子は、選択ステートメント(6.4)または反復ステートメント(6.5)の条件で、new-type-idまたはtype-idのtype-specifier-seqで変数を宣言する際にも使用できます。 new-expression(5.3.4)、for-range-declaration、および
クラス定義(9.4.2)のメンバー仕様内に表示される中括弧または等しいイニシャライザーを使用して静的データメンバーを宣言する場合。
ジェームズ・マクネリスがコメントでそれをどのように説明しているかを反映して、ここで静的である理由を見つけました。
ある国の機関は、非静力学の自動型指定子を許可することを嫌っています。電子メールから著者へ:
template< class T >
struct MyType : T {
auto data = func();
static const size_t erm = sizeof(data);
};
Xのレイアウトを決定するために、2フェーズの名前ルックアップとADLがあります。funcは型または関数のいずれかである可能性があることに注意してください。これは、T、MyTypeの名前空間、インスタンス化されたときのTの関連する名前空間、グローバル名前空間、匿名の名前空間、またはusingディレクティブの対象となる任意の名前空間にあります。注意して、運のためにconcept_mapルックアップを投入することができます。ヘッダーを含める順序によっては、ADLで異なる結果が得られ、診断する必要のない単一定義規則に違反する場合もあります。
この論争のために、著者は、非静的データメンバーに対して自動を許可することをもはや提案していません。
したがって、基本的にヘッダーを含める順序に応じて、タイプはdata
大きく異なる可能性があります。もちろん、auto x = 5;
2フェーズの名前検索やADLに依存する必要はありませんが、それ以外の場合は、ユースケースごとに個別のルールを作成する必要があるため、「包括的な」ルールにしたと思います。物事は非常に複雑です。
同じ論文で、著者はこの制限を取り除くことを提案していますが、おそらく上記の理由と、初期化子が何であっても期待される動作が同じになる可能性があるため、この提案は拒否されたようです。