問題タブ [constexpr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
5610 参照

c++ - テンプレート パラメータが 2 のべき乗であるかどうかを確認するにはどうすればよいですか?

2^N バイトの配列を静的に割り当てる構造を作成したいのですが、この構造のユーザーにこのサイズを指数として指定してほしくないのです。例:

このテンプレート パラメータが 2 のべき乗であるかどうかを確認し、これについて適切なメッセージでユーザー警告するにはどうすればよいですか?

簡単なテンプレートでこれを確認できました。

ただし、これについてユーザーに適切なメッセージで警告することはできません。何か案は?

編集

あいまいな例を修正しました。

編集

1 は確かに 2 のべき乗です。それを修正しました!:)

編集

BOOST_STATIC_ASSERT を使用すると、GCC でこのコードのコンパイル エラーが発生します。

エラー

http://ideone.com/cMfEf

編集

わかりました。これは、アサートが失敗したときに受け取るはずのメッセージでした。しかし、それではユーザーにまともなメッセージを伝えることができません。:(

0 投票する
2 に答える
2272 参照

c++ - デフォルトのテンプレート引数で constexpr を呼び出す

C++11 では、constexpr 関数をテンプレート パラメーターの既定値として使用しています。次のようになります。

G++ 4.5 および 4.7 はこれをコンパイルしますが、Clang++ 3.1 はコンパイルしません。clang からのエラー メッセージは次のとおりです。

どちらが正しいですか?

0 投票する
2 に答える
1711 参照

c++ - GCC で C++ constexpr を ROM に配置するにはどうすればよいですか?

小さな ARM (実際には Cortex) ターゲットである LPC1114 用にコンパイルします。RAM は ROM よりもはるかに制限されています。最新の Mentor (CodeBenchLite) GCC コンパイラ (GCC 4.6.3) を使用しています。ROMに入れたい定数オブジェクトがいくつかあります。私が理解している限り、以下のコードの ffx オブジェクトは ROM (コード) になるはずですが、代わりに DATA に配置されます。

オブジェクトを事前に計算して ROM に配置するようにコンパイラを説得するにはどうすればよいですか?

または多分私は尋ねる必要があります:

  • どうにかして、G++ コンパイラが ffx の ROMable データを生成することを期待できますか?
  • もしそうなら、私のコードはこれに対して正しいですか
  • もしそうなら、これがサポートされている G++ バージョンはどれですか (私は 4.6 を使用していますが、おそらく 4.7 が必要ですか?)

=======================================

このバグジラ エントリc++/49673は、私の既知の問題であり、おそらく GCC 4.7 で修正されていることを示しているようです。残念ながら、私は Mentor/CodeSourcery ビルドを使用することを好みますが、これはまだ 4.6.3 です。そのため、当分の間、バグに悩まされていると思います。:(

0 投票する
3 に答える
165 参照

c++ - Foo :: innerConstexprがリンクしないのに、UserLiteral {Foo :: innerConstexpr}がリンクするのはなぜですか?

実際のプロジェクトで見られる問題に基づいて考案した次の簡単なクラスについて考えてみます。constexprTripleは、クラスFooのインナーで使用するクイックボイラープレートタイプです。

次にmain()、のパブリック内部を使用する関数をconstexpr次のように作成Fooすると、リンクに失敗します(Windows7ではmingw-x86-64を介してg++ 4.7.0を使用)。

しかし、私が書くと

単にではなく

リンクして正常に実行されます。前者はコンパイル時リテラルが意図されたものであることをより明確に表現していることがわかりますが、後者がうまく機能しないことにまだ驚いています。constexprこれはコンパイラのバグですか、それとも最初の例だけが機能するというルールに基づく理由がありますか?

より多くの洞察を得るために他のコンパイラを試してみますが、現在、GCC4.7.0は私がアクセスできる唯一のコンパイラですconstexpr

constexprポッドの式は、明示的なリテラルラッパーがなくても正常に機能することにも注意してください。たとえば、cout << Foo::defaultPOD問題が発生したことはありません。

0 投票する
1 に答える
482 参照

c++ - GCC4.7.1オーバーロードを伴う一般化された定数式の問題

テンプレートの特殊化を使用して、コンパイル時のアルゴリズム選択を実装しようとしています。

次のコードをハッシュします。

私はこの構造をcharタイプに特化しました:

しかし、コンパイルしようとすると、GCC4.7.1で次のエラーが発生します。

エラー:フィールド初期化子が定数ではありません

この問題は、IMOが暗黙のキャストでこの問題を処理fnv_1a_32_hashする必要がある場合でも、関数がオーバーロードされているという事実に起因していると思います。size_t (*)(const char*)

オーバーロードの名前を変更するか、単に割り当てをキャストすることで、最終的に回避策を見つけました。

私の質問は:これはコンパイラのバグですか?それとも私は何かが足りないのですか?必要に応じて仕様を説明し、引用してください。


fnv_1a_32_hash実装の詳細:

0 投票する
1 に答える
1791 参照

c++ - パターンを使用して`constexpr`配列を初期化する

constexpr可変個引数テンプレートパラメータを使用して生成されたパターンで配列を初期化したいと思います。簡単にするために、constexpr unsignedタイプのリストのサイズで静的配列を初期化する問題を考えてみましょうunsigned, short, char, int, longコンパイル時にすべての計算が行われるようにするには、どうすればよいですか?C ++型システムでうまく機能するソリューションが必要なので、マクロを使用できません。

私が思いついた最善の方法を以下に示しますが、(g ++ 4.7を使用した)コンパイルg++ -std=c++11 -Wall -Ofast -Sとアセンブリの検査により、実行時に値がスタックにプッシュされていることが明らかになります。何か案は? 正常に動作します

配列初期化子を次のように使用すると、拡張n+1について拡張nについて何らかの方法で伝えることができれば機能します。

static constexpr unsigned foo[] = { compute_element<Args>::value... };

編集:待って、気にしないでください、私は頭脳を持っていました。上記の行は正常に機能します...

これがコードの答えです:

どうもありがとうございました!

0 投票する
4 に答える
34106 参照

c++ - constexpr 静的関数を使用して静的メンバーを初期化する

要件

関数から計算されたconstexpr値 (つまり、コンパイル時の定数) が必要constexprです。そして、これらの両方をクラスの名前空間、つまり静的メソッドとクラスの静的メンバーにスコープしたいと思います。

最初の試み

私は最初にこれを(私にとって)明白な方法で書きました:

g++-4.5.3 -std=gnu++0xそれに対してこう言います。

g++-4.6.3 -std=gnu++0x不満:

2 回目の試行

OK、おそらくクラス本体の外に移動する必要があると思いました。だから私は次のことを試しました:

g++-4.5.3文句なしにそれをコンパイルします。残念ながら、私の他のコードは範囲ベースのforループを使用しているため、少なくとも 4.6 が必要です。サポート リストをよく見るconstexprと、4.6 も必要なようです。そして、g++-4.6.3私は得る

これは私には本当に奇妙に聞こえます。ここで物事はどのように「異なるconstexpr」のですか?-fpermissive他のコードを厳密にチェックすることを好むので、追加する気はありません。foo実装をクラス本体の外に移動しても、目に見える効果はありませんでした。

予想される答え

誰かがここで何が起こっているのか説明できますか? どうすればやろうとしていることを達成できますか? 私は主に次の種類の回答に興味があります。

  • これを gcc-4.6 で機能させる方法
  • それ以降の gcc バージョンがバージョンの 1 つを正しく処理できるという観察
  • 実際に動作させることについて gcc 開発者にバグを報告できるように、少なくとも 1 つの構成要素が動作するはずの仕様へのポインター
  • 私が欲しいものは仕様上不可能であるという情報、できればこの制限の背後にある理論的根拠についての洞察があれば

他の有用な回答も歓迎しますが、おそらく簡単には受け入れられないでしょう。

0 投票する
2 に答える
7319 参照

c++ - 静的メンバーとしてのラムダ

次のように、ラムダを静的メンバーとして使用しようとしています。

これは正しい C++11 コードですか? clang で、次のエラーが発生します。

ラムダは定数式とは見なされません。これは正しいです?おそらく、gcc 4.7 ではラムダを として許可しているように見えるため、clang でラムダをまだ完全に実装していない可能性constexprがありますが、別のエラーが発生します。

よくわかりませんが、それが何を意味するのか理解しています。ラムダの型を正しく推測しているように見えますが、宣言するだけで定義しません。それを定義するにはどうすればよいですか?

0 投票する
2 に答える
1167 参照

c++ - コンパイル時に小さい整数の階乗を計算する

コンパイル時に整数の階乗を計算するための再帰的なテンプレートを (もう一度) 実装しました (いつか実際に必要になると誰が思ったでしょう!)。それでも、私は自分自身を転がす代わりに、答えを探してBoostに行きました. ただし、特別な数学の階乗関数は、整数型での使用を明確に禁止しているため、独自に作成しました。

それでも、使用すべき Boost の別の機能はありますか? 整数を関数にキャストしてdouble使用する必要がありboost::factorialますか? 計算はコンパイル時に実行されますか?

0 投票する
2 に答える
199 参照

c++ - 値を定数式で使用できるクラスの配列を初期化するにはどうすればよいですか?

定数式で値を使用できるクラスの配列を初期化する方法を知りたいです。これが私の問題の説明です:

C ++ 2011でこれを行う方法はありますか?(constexprまたはメタプログラミングで多分?)

どうもありがとうございます !

編集:タイトルが指定しているように、私arrayはクラスのメンバーである必要があります(グローバル配列ではありません)。