問題タブ [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.
c++ - X マクロを置き換えるテンプレート/constexpr/C++11 の方法はありますか?
C++11 機能を使用して、できればプリプロセッサを使用せずにXmacroイディオムを置き換える方法はありますか? タプル テンプレートを使用できると考えていましたが、それらがどのように機能するかをまだ理解しようとしています。
c++ - 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::string
std::string
static std::string const []
std::string
std::string
char const *
constexpr
コンストラクター以外の例については、要件を無視できる(したがって非関数を作成する) ことができれば、より効率的な関数を作成std::string
できる例を見つけるのは非常に簡単だと思います。次のスレッドを考えてみてください: constexpr の質問、なぜこれら 2 つの異なるプログラムが g++ でこれほど異なる時間で実行されるのですか?constexpr
constexpr
引数を指定して呼び出した場合、関数呼び出しを完全に最適化するコンパイラよりも優れた結果fib
を出すconstexpr
ことはできません。しかし、引数なしで呼び出す場合はfib
、メモ化 (状態が必要) などを実装する独自のバージョンを呼び出して、引数constexpr
を渡した場合のコンパイル時間と同様の実行時間を取得したい場合があります。 constexpr
.
c++ - Constexpr変数がLambda内で初期化されていないように見える
x
以下のコードサンプルでは、はstatic constexpr
変数であるため、出力は次のようになると予想されます。
x
ただし、g ++は、を使用してコンパイルすると、ラムダ関数内で初期化されていないことを警告し-Wall
ます。おそらく、スタック上の初期化されていないメモリの値が出力されているため、出力の最後の3行が異なります。これは、オプションを使用してコンパイルされたときにプログラムによって生成される可能性のある出力の1つ-Wall -std=c++0x
です。出力が期待したものではないのはなぜですか?
それが役立つ場合constexpr
は、宣言でが削除されたときに期待される出力が生成されconstexpr T x
ます。
サンプルプログラム
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)
c++ - 文字列操作を使用したconstexprの回避策?
この以前に回答された質問は、私が以下に投稿したコードが機能しない理由を説明しています。フォローアップの質問があります:概念的に同等の回避策がありますか?つまり、コンパイル時の文字列連結を実現しますが、実際にはC ++ 11でサポートされている方法で実装されていますか?std::stringの使用は完全に必須ではありません。
c++ - コンパイル時のエンディアンのテスト: この constexpr 関数は標準に従って正しいですか?
コンパイル時にエンディアンをチェックする方法をいくつか検索した後、次の解決策を思いつきました。
GCC は、constexpr が必要な一部のコンテキストでのみこのコードを受け入れます。
2 番目のケースでは、GCC は次のように述べてerror: accessing value of ‘a’ through a ‘char’ glvalue in a constant expression
います。そのようなことを禁止する規格は何も見つかりませんでした。多分誰かがGCCが正しい場合を明確にすることができますか?
c++ - constexpr ベースの計算はチューリング完全ですか?
C ++テンプレート メタプログラミングはチューリング完全ですが、プリプロセッサ メタプログラミングは完全ではありません。
C++11 は、constexpr 関数の計算という新しい形式のメタプログラミングを提供します。この形式の計算はチューリング完全ですか? constexpr関数は再帰や条件演算子(?:)が許されているので、そうなのかなと思っているのですが、詳しい方に確認していただきたいです。
c++ - 「参照渡し」または「参照渡し」パラメータが constexpr と互換性があるのはいつですか?
constexpr とマークされた関数は、不変の純粋な関数であると想定されています。「std::max() and std::min() not constexpr」投稿から、const 参照入力を出力として再チャネル化することはできません。これには、パラメーターに永続性が必要になるためです。const
しかし、再チャネル化しない限り、パラメータを -reference で取得できますか?
逆に、-enabled 型のサブオブジェクトへの const 参照を返すことはできますconstexpr
か?
それとも、サブオブジェクトの戻り値でさえも値渡しである必要がありますか?
(これが基本的なものである場合は申し訳ありませんが、実際に決定的ではなく、この時点で私が見つけたものはすべてダンスです。)
c++ - constexpr 関数評価は末尾再帰の最適化を実行できますか
長いループの場合、C++11 で constexpr の末尾再帰を利用できるのだろうか?
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 にとっても十分に賢明ではありません。
他の誰かが良い考えを持っていますか?