問題タブ [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 に答える
10641 参照

c++ - 定数式でnumeric_limits::max()を使用する

クラス内で、可能な最大のint値である定数を定義したいと思います。このようなもの:

この宣言は、次のメッセージでコンパイルに失敗します。

nude.cpp:8:エラー:'std :: neuro_limits :: max()'は定数式に表示できませんnumeric.cpp:8:エラー:関数呼び出しは定数式に表示できません

これが機能しない理由は理解できますが、2つのことが奇妙に見えます。

  1. 定数式で値を使用するのは自然な決断のように思えます。言語設計者がmax()を関数にして、この使用を許可しないことにしたのはなぜですか?

  2. 仕様は18.2.1で次のように主張しています

    nude_limitsテンプレートでstaticconstと宣言されたすべてのメンバーについて、特殊化は、これらの値を整数定数式として使用できるように定義する必要があります。

    シナリオで使用できるはずで、エラーメッセージと矛盾しないのではないでしょうか。

ありがとうございました。

0 投票する
14 に答える
133284 参照

c++ - C ++ 11でconstexpr機能を使用する必要があるのはいつですか?

「常に5を返す関数」を持つことは、「関数を呼び出す」という意味を壊したり、薄めたりしているように思えます。理由があるか、この機能が必要であるか、C++11にはないはずです。なんでそこにあるの?

リテラル値を返す関数を作成し、コードレビューを思いついた場合、誰かが私に言うでしょう、それなら、return 5を書く代わりに、定数値を宣言する必要があります。

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

c++ - 関数を`constexpr`として宣言しないのはなぜですか?

returnステートメントのみで構成される関数は宣言できます 。したがって、すべての引数がであり、関数のみが本体で呼び出されるconstexpr場合、コンパイル時に評価できます。そのような関数を宣言しない理由はありますか?constexprconstexprconstexpr

例:

constexpr 関数の宣言が害を及ぼす例を誰かが提供できますか?


いくつかの最初の考え:

関数を宣言する正当な理由がない場合でもconstexpr、キーワードが過渡的な役割を果たしているとは想像できconstexprませんでした。コンパイル時の評価を必要としないコードがないため、コンパイル時の評価を実装していないコンパイラでは、そのコードをコンパイルします(ただし、を使用して明示的に作成されたコードを必要とするコードでは確実に失敗しますconstexpr)。

しかし、私が理解していないこと:関数を宣言しない正当な理由がない場合、標準ライブラリ内のすべてconstexprの関数が宣言されないのはなぜですか?(まだ十分な時間がなかったため、まだ完了していないと主張することはできません。すべての機能を実行するのは簡単です。すべての機能を実行するかどうかを決定するのとは対照的です。)- --N2976は、コンテナなどの多くの標準ライブラリタイプにcstrを意図的に必要としないことを認識しています。これは、可能な実装には制限が多すぎるためです。それらを引数から除外して、疑問に思います。標準ライブラリの型に実際にcstrが含まれていると、それを操作するすべての関数が宣言されないのはなぜですか。constexprconstexprconstexprconstexpr

constexprほとんどの場合、コンパイル時の使用を想定していないという理由だけで関数を宣言したくないと主張することもできません。他の人がevtlを使用している場合です。あなたのコードを使用します、彼らはあなたがそうしないような使用を見るかもしれません。(ただし、もちろん、タイプ特性タイプなどには付与されます。)

だから私は、関数を故意に宣言しないための正当な理由と良い例があるに違いないと思いますconstexprか?

(「すべての関数」とは、常に意味しますconstexpr。つまり、単一のreturnステートメントとして定義され、constexpr cstrsを持つ型の引数のみを取り、関数のみを呼び出すための要件を満たすすべての関数constexpr。C++ 14以降、はるかに多くのこのような関数の本体で許可されています。たとえば、C ++ 14 constexpr関数はローカル変数とループを使用する可能性があるため、さらに幅広いクラスの関数を宣言できますconstexpr。)

質問なぜstd::forward捨てるのconstexprか?これの特殊なケースです。

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

c++ - タプル要素のオフセットを取得します

タプル要素のオフセットを取得するために次のコードを書きました

これは実際には、offsetofマクロの実装に似ています。見栄えは悪いですが、コンパイルして gcc-4.6 で問題なく動作します。

「1000」を出力します。

私は constexpr についてあまり知らないので、私の質問は次のとおりです。

  1. それは合法的なc ++ですか?
  2. さらに重要なのは、constexpr 関数内で std::get (constexpr ではない) を呼び出すことが許可されているのはなぜですか?

私が constexpr を理解している限り、コンパイラはコンパイル時に式の結果を評価することを強制されるため、実際にはゼロ参照解除は発生しません。

0 投票する
5 に答える
13790 参照

c++ - initializer_list::size() の static_assert

libstdc++ (v. 4.6) でa として宣言されているのにstd::initializer_list<_E>::size、 a で許可されないのはなぜですか?static_assertconstexpr

たとえば、次のコード:

次のエラーが発生します。

これは、簡単な例では問題なく機能することに注意してください。

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

c++ - constexpr と純関数の関係

私は正しいですか:

  • constexprで定義された関数はすべて純粋な関数であり、
  • constexprコンパイラにとって非常に高価でない場合、任意の純粋な関数を定義することができ、定義する必要があります。

もしそうなら、なぜ arent<cmath>の関数が で定義されているのconstexprでしょうか?

0 投票する
5 に答える
13184 参照

c++ - std :: max()およびstd :: min()はconstexprではありません

min(a,b)新しい標準で定義されているものとされていmax(a,b) ない ものに気づきましたconstexpr

25.4.7、[alg.min.max]の例:

これは残念ではありませんか?書きたかったのに

それ以外の

それらができないconstexpr理由は何ですか?

0 投票する
6 に答える
7357 参照

c++ - constexpr は本当に必要ですか?

私は C++ の新constexpr機能を見てきましたが、その必要性を完全には理解していません。

たとえば、次のコード:

次のように置き換えることができます:

アップデート

2 番目の例は、実際には標準の ISO C++ ではありませんが (これを指摘してくれた複数のユーザーに感謝します)、特定のコンパイラ (gcc など) がサポートしています。したがってconst、プログラムが有効であるということではなく、gcc がこの非標準機能をサポートしているという事実です。(私の知る限り、これは配列が関数またはメソッドに対してローカルとして定義されている場合にのみ可能です。グローバル配列のサイズはコンパイル時にまだわかっている必要があるためです。) options なしでコンパイルすると-std=c++98 -pedantic-errors、コード

gcc でコンパイルします。

そのため、これまでに寄せられたフィードバックを考慮して、私の質問を言い換えてみます (また、その間に行ったいくつかの追加の読書も)。

constキーワードを多用しています。を使用constすると、有効期間全体で特定の値を持つ定数を定義できます。定数は任意の式で初期化できます。式は一度評価されます。つまり、定数の作成時に評価されます。これらの場合、それはかなり役に立たないと思います。constexpr定数値を定義する式が実行時ではなくコンパイル時に計算されるという点で、非常に小さな最適化が導入されます。複雑な初期化を伴う実行時定数が必要になるたびに、キーワード を使用しconstます。

そのconstexprため、コンパイル時に定数を初期化する必要がある状況で役立つ場合があります。1 つの例はベクトル定義です。標準では、実行時のサイズの定義はサポートされていません。もう 1 つの例は、1 つ以上の型以外のパラメーターを持つテンプレートです。

そのような場合、私は通常マクロを使用します。

しかし、私の理解が正しければ、関数は定義内constexprで関数の再帰呼び出しを許可するため、マクロよりも強力です。constexprしかし、このような複雑な計算を使用してコンパイル時の定数を定義したいと思った実用的なアプリケーションは思いつきません。

したがって、たとえそれが興味深い機能であったとしても、それが必要かどうか (つまり、マクロが十分でない状況をどのくらいの頻度で解決できるか) はまだ疑問に思っています。マクロでは解決できない実際の例をいくつか見てみると、この意見を変えるのに役立つかもしれません。

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

c++ - constexpr関数をテンプレート引数として使用することは有効ですか?

私はこのコードをideoneでコンパイルしました。そして、なぜそれがコンパイルエラーを引き起こしているのか疑問に思いました。constexpr関数は引数として許可されていませんかtemplate、それともコンパイラのバグですか?

編集:に変更const int get()さらにint get() 、ideoneにはもう1つのバグconstexprがあります。削除しても、配列の宣言が許可されます。それはC99の機能だと思います。

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

c++ - constexpr はラムダ関数/式でサポートされていますか?

gcc-4.6 では、error: function needs to be constexpr. constexprいろいろな場所にパッティングの組み合わせを試してみましたが、うまくいきませんでした。

constexprラムダ関数もサポートされていますか (タイプが指定されているかどうかに関係なくreturn) ? 正しい構文は何ですか?

回避策はありますか?