問題タブ [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 投票する
5 に答える
5639 参照

c++ - is_constexpr は C++11 で可能ですか?

C++11 式が C++11 の定数式 (つまり ) であるかどうかに基づいて、コンパイル時のブール値を生成することは可能constexprですか? SO に関するいくつかの質問はこれに関連していますが、どこにも明確な答えはありません。

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

c++ - コンパイル時に Constexpr を使用して配列を作成する

constexpr を使用して列挙型の配列を設定したいと思います。配列の内容は特定のパターンに従います。

ASCII 文字セットを 4 つのカテゴリに分ける列挙型があります。

128 の配列が欲しいTypeです。それらは構造内にある可能性があります。配列のインデックスは ASCII 文字に対応し、値はType各文字の になります。

したがって、この配列をクエリして、ASCII 文字がどのカテゴリに属しているかを調べることができます。何かのようなもの

長いマクロハックなしでこれが可能かどうか知りたいです。

現在、次のようにしてテーブルを初期化しています。

INITIALIZE、非常に長いマクロ ハックのエントリ ポイントです。何かのようなもの

このマクロハックを必要とせずに、この配列または配列を含む構造体を作成する方法が欲しい...

多分何かのような

それで、問題はこれをどのように書くMagicFunctionかです。

注:私は cctype と likes を認識しています。この質問Is this possible?Is this the best way to do it?.

どんな助けでも大歓迎です。

ありがとう、

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

c++ - C++ による const の初期化

次の点での違いは何ですか。

const int a が bss セクションに格納され、 const int b が格納されず、両方がコンパイラによって引き続き適用されるという唯一の違いです。

したがって、bssに保存されているため、高速ですか?const in a はコンパイル時に計算されるため、これは constexpr の使用例ですか? constexpr は、bss セクションに格納されている b に const を作成しますか?

ブレア

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

c++ - 変数のconstとconstexpr

次の定義に違いはありますか?

そうでない場合、C ++ 11ではどのスタイルが推奨されますか?

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

c++ - この constexpr コードにより、GCC がすべての RAM を消費するのはなぜですか?

次のプログラムはfun を2 ^ (MAXD + 1) 回呼び出します。ただし、最大再帰深度が MAXD を超えることはありません (私の考えが正しければ)。したがって、コンパイルに時間がかかる場合がありますが、RAM を消費することはありません。

問題は、RAM を消費することがまさにそれであるということです。MAXD を 30 まで上げると、GCC 4.7.2 が 3 GB 程度をすばやく割り当てた後、ラップトップがスワップし始めます。現在、clang 3.1 にアクセスできないため、clang 3.1 ではまだ試していません。

私の唯一の推測は、これは GCC が巧妙になりすぎて、テンプレートの場合のように関数呼び出しをメモ化しようとすることに関係があるということです。だとすると、MRU キャッシュ テーブルのサイズとか、メモ化の量に制限がないのはおかしいと思いませんか? 無効にするスイッチが見つかりませんでした。

なぜ私はこれをするのですか?私は、遺伝的プログラミングなどの高度なコンパイル時ライブラリを作成するというアイデアをいじっています。コンパイラにはコンパイル時の末尾呼び出しの最適化がないため、ループするものすべてに再帰が必要になるのではないかと心配しています (最大再帰深度パラメータを上げても、要求するのが少し醜いように見えます) すべての RAM がすぐに割り当てられていっぱいになります無意味なスタックフレームでそれ。したがって、深いスタックなしで任意に多くの関数呼び出しを取得するための上記のソリューションを思いつきました。このような機能は、折りたたみ/ループまたはトランポリンに使用できます。

編集:clang 3.1で試してみましたが、どれだけ長く機能させても(つまり、MAXDをどれだけ高くしても)メモリリークはまったくありません。予想通り、CPU 使用率はほぼ 100%、メモリ使用率はほぼ 0% です。おそらく、これは GCC の単なるバグです。

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

c++ - コンパイル時の std::cout と同等、または c++11 でのコンパイル時の定数値の static_assert 文字列化

コンパイル時に aconstexprまたはd 値の値を出力する方法はありますか? #defineに相当するstd::cout <<、または次のようなことを行う何らかの方法が必要です

編集:constexpr少なくともgccでは、次のようなことを行うことで、sを使用して基本的なコンパイル時の印刷を行うことができます

それは私に与えますerror: incomplete type ‘display_non_zero_int_value<1>’ used in nested name specifier static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");。(一方、icpcはあまり役に立たず、ただ言うだけerror: incomplete type is not allowedです)これを一般化して、次のようなことができるようにするマクロを作成する方法はありますか

どういうわけか、4を含むエラーメッセージが表示されますか?

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

c++ - constexpr オブジェクトをキャプチャするラムダ

GCC 4.7.2 はこれをコンパイルします。

しかし、これではありません:

C++11 §5.1.2/15 によると、後者の例は私には正しいように見えます。

エンティティが暗黙的または明示的にキャプチャされ、コピーによってキャプチャされない場合、エンティティは参照によってキャプチャされます。追加の名前のない非静的データ メンバーが、参照によってキャプチャされたエンティティのクロージャ型で宣言されているかどうかは指定されていません。

ラムダ内のキャプチャされたオブジェクトは、単なる参照ではなくi、囲んでいるスコープ内の変数を参照しているようです。constexprconst

標準では、値によるキャプチャの使用はラムダ オブジェクトの対応するメンバーの使用に変換されると明示的に述べています。そして、5.1.2 は私の解釈が正しいことを暗示していると思います。

参照によるキャプチャが、囲んでいるスコープまたは参照内のオブジェクトを参照するかどうかを明示的に示すものはありますか?

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

c++ - この constexpr 整数は null ポインター定数ではありませんか?

次の C++11 プログラムと、GCC 4.7.2 での結果を考えてみましょう。

標準によると:

[C++11: 4.10/1]:null ポインター定数は、0 に評価される整数型の整数定数式 (5.19) prvalue です [..]

5.19 はめちゃくちゃで、完全に解析できませんでしたが、iこの基準を満たし、ヌル ポインター定数int*として機能することを期待しないので、初期化のために明示的な変換を必要としませんpか?

ではなくI s/constexpr/const/and でコンパイルすると、コンパイルは成功します。-ansi-std=c++11

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

c++ - constexpr ポインタによる初期化

const オブジェクトである int へのポインターを使用して constexpr 宣言を初期化しようとしています。また、const 型ではないオブジェクトを使用してオブジェクトを定義しようとしています。

コード:

g++ ログ:

メインのオブジェクトに固定アドレスがないためだと思います。したがって、g ++ がエラーメッセージを返してくれます。これをどのように修正しますか?リテラル型を使用しない。

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

c++ - C++11 標準のどこで、変換中に constexpr 関数をいつ評価できるかを指定していますか?

関数(またはコンストラクタ)のためだけに...

  • constexpr と宣言され、
  • 関数定義は constexpr 要件を満たしています

...コンパイラが変換中に constexpr 関数を評価するという意味ではありません。C++11 FDIS (N3242、http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/ で入手可能) を調べて、次の 2 つのことを試してみました。

  • 翻訳中にコンパイラが constexpr 関数を評価する義務があるのはいつですか?
  • 翻訳中にコンパイラが constexpr 関数を評価できるのはいつですか?

セクション 5.19 パラグラフ 1 は、変換中に定数式を評価できると述べています。私が理解できる限り、セクション 5.19 の残りの部分では、constexpr 関数の定義で何が有効かについてのルールを説明しています。

constexpr 関数の結果を constexpr として宣言することで、翻訳中に constexpr の評価を強制できることを理解しています。このような:

これまでのところ、FDIS で次の段落を見つけることができませんでした。

  • twoEulers翻訳中に評価される力または
  • コンパイラが変換中に constexpr 関数を評価する場合、または評価する必要がある場合のその他の状況を指定します。

私が特に興味を持っているのは、翻訳中の constexpr 評価が以下によってトリガーされるかどうかです。

  1. constexpr 関数に渡されるすべてのパラメーターがリテラルの場合、または
  2. オーバーロード解決中の暗黙のオブジェクト引数(セクション 13.3.1 パラグラフ 3) は、constexpr であるか、リテラル (配列次元など) を必要とするか、または
  3. まったく別の何か。

可能であれば、回答の中で、私が調べられる FDIS のセクションまたは FDIS で検索できるキー フレーズを引用してください。標準の英語はやや鈍いので、関連する段落を読んでいて、その意味や意図を完全に見逃している可能性があります。