要件
関数から計算されたconstexpr
値 (つまり、コンパイル時の定数) が必要constexpr
です。そして、これらの両方をクラスの名前空間、つまり静的メソッドとクラスの静的メンバーにスコープしたいと思います。
最初の試み
私は最初にこれを(私にとって)明白な方法で書きました:
class C1 {
constexpr static int foo(int x) { return x + 1; }
constexpr static int bar = foo(sizeof(int));
};
g++-4.5.3 -std=gnu++0x
それに対してこう言います。
error: ‘static int C1::foo(int)’ cannot appear in a constant-expression
error: a function call cannot appear in a constant-expression
g++-4.6.3 -std=gnu++0x
不満:
error: field initializer is not constant
2 回目の試行
OK、おそらくクラス本体の外に移動する必要があると思いました。だから私は次のことを試しました:
class C2 {
constexpr static int foo(int x) { return x + 1; }
constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));
g++-4.5.3
文句なしにそれをコンパイルします。残念ながら、私の他のコードは範囲ベースのfor
ループを使用しているため、少なくとも 4.6 が必要です。サポート リストをよく見るconstexpr
と、4.6 も必要なようです。そして、g++-4.6.3
私は得る
3:24: error: constexpr static data member ‘bar’ must have an initializer
5:19: error: redeclaration ‘C2::bar’ differs in ‘constexpr’
3:24: error: from previous declaration ‘C2::bar’
5:19: error: ‘C2::bar’ declared ‘constexpr’ outside its class
5:19: error: declaration of ‘const int C2::bar’ outside of class is not definition [-fpermissive]
これは私には本当に奇妙に聞こえます。ここで物事はどのように「異なるconstexpr
」のですか?-fpermissive
他のコードを厳密にチェックすることを好むので、追加する気はありません。foo
実装をクラス本体の外に移動しても、目に見える効果はありませんでした。
予想される答え
誰かがここで何が起こっているのか説明できますか? どうすればやろうとしていることを達成できますか? 私は主に次の種類の回答に興味があります。
- これを gcc-4.6 で機能させる方法
- それ以降の gcc バージョンがバージョンの 1 つを正しく処理できるという観察
- 実際に動作させることについて gcc 開発者にバグを報告できるように、少なくとも 1 つの構成要素が動作するはずの仕様へのポインター
- 私が欲しいものは仕様上不可能であるという情報、できればこの制限の背後にある理論的根拠についての洞察があれば
他の有用な回答も歓迎しますが、おそらく簡単には受け入れられないでしょう。