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

c++ - X マクロを置き換えるテンプレート/constexpr/C++11 の方法はありますか?

C++11 機能を使用して、できればプリプロセッサを使用せずにXmacroイディオムを置き換える方法はありますか? タプル テンプレートを使用できると考えていましたが、それらがどのように機能するかをまだ理解しようとしています。

0 投票する
8 に答える
12614 参照

c++ - constexpr オーバーロード

関連: constexpr を返す関数がコンパイルされない

constexpr は、C++11 での有用性が制限されているように感じます。これは、そうでなければ同じシグネチャを持つが、1 つが constexpr で、もう 1 つが constexpr でない 2 つの関数を定義できないためです。つまり、たとえば、constexpr 引数のみを取る constexpr std::string コンストラクターと、非 constexpr 引数用の非 constexpr std::string コンストラクターがあれば非常に便利です。もう 1 つの例は、state を使用してより効率的にすることができる、理論的に複雑な関数です。これを constexpr 関数で簡単に行うことはできないため、次の 2 つの選択肢があります。constexpr 以外の引数を渡すと非常に遅い constexpr 関数を使用するか、constexpr を完全に放棄するか (または 2 つの別個の関数を記述し、ただし、どのバージョンを呼び出すべきかわからない場合があります)。

したがって、私の質問は次のとおりです。

標準準拠の C++11 実装で、引数が constexpr であることに基づいて関数のオーバーロードを許可することは可能ですか?それとも標準を更新する必要がありますか? 許可されていない場合、意図的に許可されていませんでしたか?


@NicolBolas: を にマップする関数があるとしenumますstd::string。これを行う最も簡単な方法は、 myenumが から0に進むと仮定して、結果で満たされたn - 1サイズの配列を作成することです。n

を作成して戻り時にstatic constexpr char const * []構築する(関数を呼び出すたびにオブジェクトを作成するコストを支払う) ことも、 を作成して検索した値を返すこともできます。関数を呼び出します。より良い解決策は、コンパイル時にメモリ内に を作成することだと思われますが (現在 で行われているのと同様)、これを行う唯一の方法は、コンストラクタに引数があることを警告することです。std::stringstd::stringstatic std::string const []std::stringstd::stringchar const *constexpr

コンストラクター以外の例については、要件を無視できる(したがって非関数を作成する) ことができれば、より効率的な関数を作成std::stringできる例を見つけるのは非常に簡単だと思います。次のスレッドを考えてみてください: constexpr の質問、なぜこれら 2 つの異なるプログラムが g++ でこれほど異なる時間で実行されるのですか?constexprconstexpr

引数を指定して呼び出した場合、関数呼び出しを完全に最適化するコンパイラよりも優れた結果fibを出すconstexprことはできません。しかし、引数なしで呼び出す場合はfib、メモ化 (状態が必要) などを実装する独自のバージョンを呼び出して、引数constexprを渡した場合のコンパイル時間と同様の実行時間を取得したい場合があります。 constexpr.

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

c++ - Constexpr変数がLambda内で初期化されていないように見える

x以下のコードサンプルでは、​​はstatic constexpr変数であるため、出力は次のようになると予想されます。

xただし、g ++は、を使用してコンパイルすると、ラムダ関数内で初期化されていないことを警告し-Wallます。おそらく、スタック上の初期化されていないメモリの値が出力されているため、出力の最後の3行が異なります。これは、オプションを使用してコンパイルされたときにプログラムによって生成される可能性のある出力の1つ-Wall -std=c++0xです。出力が期待したものではないのはなぜですか?

それが役立つ場合constexprは、宣言でが削除されたときに期待される出力が生成されconstexpr T xます。

サンプルプログラム

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

c++ - テンプレート引数で渡された C++11 constexpr 関数の引数

これは数週間前に機能していました:

しかし、今g++ -std=c++0xは次のように述べています。

clang++ -std=c++11無効なため、テンプレートのパラメーターtfunc<T, t>()が無視されることを示しています。

それはバグですか、それとも修正ですか?

PS:

g++ --version=>g++ (GCC) 4.6.2 20120120 (prerelease)

clang++ --version=> clang version 3.0 (tags/RELEASE_30/final)(3.0.1)

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

c++ - 文字列操作を使用したconstexprの回避策?

この以前に回答された質問は、私が以下に投稿したコードが機能しない理由を説明しています。フォローアップの質問があります:概念的に同等の回避策がありますか?つまり、コンパイル時の文字列連結を実現しますが、実際にはC ++ 11でサポートされている方法で実装されていますか?std::stringの使用は完全に必須ではありません。

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

c++ - コンパイル時のエンディアンのテスト: この constexpr 関数は標準に従って正しいですか?

コンパイル時にエンディアンをチェックする方法をいくつか検索した後、次の解決策を思いつきました。

GCC は、constexpr が必要な一部のコンテキストでのみこのコードを受け入れます。

2 番目のケースでは、GCC は次のように述べてerror: accessing value of ‘a’ through a ‘char’ glvalue in a constant expressionいます。そのようなことを禁止する規格は何も見つかりませんでした。多分誰かがGCCが正しい場合を明確にすることができますか?

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

c++ - constexpr ベースの計算はチューリング完全ですか?

C ++テンプレート メタプログラミングはチューリング完全ですが、プリプロセッサ メタプログラミングは完全ではありません

C++11 は、constexpr 関数の計算という新しい形式のメタプログラミングを提供します。この形式の計算はチューリング完全ですか? constexpr関数は再帰や条件演算子(?:)が許されているので、そうなのかなと思っているのですが、詳しい方に確認していただきたいです。

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

c++ - 「参照渡し」または「参照渡し」パラメータが constexpr と互換性があるのはいつですか?

constexpr とマークされた関数は、不変の純粋な関数であると想定されています。「std::max() and std::min() not constexpr」投稿から、const 参照入力を出力として再チャネル化することはできません。これには、パラメーターに永続性が必要になるためです。constしかし、再チャネル化しない限り、パラメータを -reference で取得できますか?

逆に、-enabled 型のサブオブジェクトへの const 参照を返すことはできますconstexprか?

それとも、サブオブジェクトの戻り値でさえも値渡しである必要がありますか?

(これが基本的なものである場合は申し訳ありませんが、実際に決定的ではなく、この時点で私が見つけたものはすべてダンスです。)

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

c++ - constexpr 関数評価は末尾再帰の最適化を実行できますか

長いループの場合、C++11 で constexpr の末尾再帰を利用できるのだろうか?

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

c++ - C++11 constexpr で double のビット パターンが 0x0 であることを確認する方法は?

特定の double/float 変数に実際のビット パターン 0x0 があることを確認したいと考えています。qIsNull()理由は聞かないでください。私がしたいQt () の関数で使用されていますconstexpr

元のコードでは共用体を使用していました:

constexprこれは当然のこととして機能しません。

次の試みは次のとおりでしたreinterpret_cast

しかしconstexpr、それは GCC 4.7 では a として機能しますが、Clang 3.1 では失敗します (当然のことながら、ポインター操作の b/c)。

最終的なアイデアは、Alexandrescuesque に行き、これを行うことでした。

しかし、それは Clang にとっても十分に賢明ではありません。

他の誰かが良い考えを持っていますか?