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

c++ - constexpr と返すテンプレート関数での C++0x エラー

C++ template non-type parameter type deductionという質問の問題の解決策を見つけようとしました。これには、f を呼び出すテンプレート パラメーターは含まれませんが、暗黙的にテンプレート パラメーターの正しい型が選択されます。

constexprは、関数にコンパイル時の定数のみが含まれ、コンパイル時に評価されることを保証する必要があるため(少なくともそれが私が考えていることです)、この問題の解決策になると思いました。だから私はこれを思いついた:

最初のバージョンでは、次のエラーが生成されます。

末尾の戻り値の型の decltype ステートメントでのパラメーターの使用は問題ないはずなので、これは本当に紛らわしいですか?

2 番目のバージョンでは、次のエラーが生成されます。

私は完全fget_f. を持っていない場合、この種のエラー メッセージが表示されることが予想されますconstexpr。それで、私は何をしているのかconstexpr、またはGCCのC ++ 0x実装にこの場合の欠陥がありますか?

GCC 4.6.2 を使用しています

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

c++ - 可能な限りconstexprを使用する必要がありますか?

明らかにすべてを作ることはできませんconstexpr。そして、何もしなければconstexpr、大きな問題はありません。これまで、多くのコードがそれなしで書かれてきました。

constexprしかし、それを持っている可能性のあるものを平手打ちするのは良い考えですか?これに潜在的な問題はありますか?

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

c++ - constexpr with operator | =

C ++ 0x constexprを使用して、入力セットの最上位ビットのみを含む整数を返す関数を作成しようとしました。

これにより、gcc4.6.1を使用したコンパイル時の失敗が発生します。

constexprキーワードがなくても機能することに注意してください。

私の質問は次のとおりです。

なぜこれが機能しないのですか?operator | =はconstexprではないことがわかりますが、組み込み型にとっては重要ですか?

この関数をconstexprとして書く簡単な方法はありますか?実行時にかなり効率的になるようにしたいと思います。読みやすさについては少し気にしています。

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

c++ - C++での関数呼び出し定数伝播

検索しても答えが見つからなかったので、次のステップは質問です。次のようなコードがあるとします。

このようにコードを呼び出すonbit(A, 4)と、定数4が伝播されて最適化されますか、それとも定数になるtemplate<int n, class Int>ようにテンプレート()にする必要があります。ここではC++0x constexprが必要ですか?必要な場合は、どの程度正確に使用する必要がありますか(int nconstまたはconstexprである必要がありますか?)。

constexprは定数パラメーターで機能することを知っていますが、パラメーターの一部が一定で一部が可変である場合、部分的に最適化されますか?

要約:関数(インラインで正しくなければならない)を定数伝播で部分的に最適化することは可能ですか?もしそうなら、それを行うための要件は何ですか?

これを書いているときでさえ、インライン関数呼び出しが定数を伝播すると思っています...

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

c++ - constexprの質問、なぜこれら2つの異なるプログラムがg ++でこのように異なる時間で実行されるのですか?

私はgcc4.6.1を使用していて、constexpr関数の呼び出しを含むいくつかの興味深い動作を取得しています。このプログラムは問題なく実行され、すぐに印刷され12200160415121876738ます。

このプログラムの実行には永遠に時間がかかり、値が出力されるのを待つのに我慢できませんでした。

なぜそんなに大きな違いがあるのですか?2番目のプログラムで何か間違ったことをしていますか?

編集:私はこれをg++ -std=c++0x -O364ビットプラットフォームでコンパイルしています。

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

c++ - 単純な可変個引数テンプレート関数はインスタンス化できません

が C++0x のパックされたテンプレート引数リストの型の数を生成することは承知していsizeof...(Args...)ますが、デモンストレーション目的で他の機能に関してそれを実装したかったのですが、コンパイルされません。

*HERE*でのこのエラー

つまり、最初に定義された基本ケースが表示されません。前方宣言template<typename...T>num_args();は、オーバーロードの解決にあいまいさをもたらします。

gcc 4.6 を使用しています。どうすればこれを機能させることができますか?

ありがとう。

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

c++ - インライン対constexpr?

新しいC++11標準では、inlineキーワードよりもconstexprキーワードをいつ使用する必要がありますか?constexprキーワードは、に対して追加の最適化を提供しますかinline、それともコンパイル時に計算する必要があると主張するだけですか?

非変数のconstexpr呼び出しなど、呼び出しが一定でない場合にGCCで機能するのはなぜですか?これはGCCのバグですか、それとも実際には標準の一部ですか?foo(x)constexpr

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

c++11 - C++11: static_assert() の std::max(a,b)?

max私は、最後の C++-Std Doc N3291 の [24.4.7] ではないことに気付きましたconstexpr:

したがって、static_assertたとえば、これを使用することは許可されていません。正しい?

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

c++ - 文字列リテラルを定数式で添え字化できますか?

constexpr式は「constexprで定義された不揮発性オブジェクトを参照する、またはそのようなオブジェクトのサブオブジェクトを参照するリテラル型のglvalue」(§5.19/ 2)の値を取ることができるため、これは有効です。)::

ただし、文字列リテラルはこの説明に適合しないようです。

2.14.5 / 8は、文字列リテラルのタイプを説明しています。

通常の文字列リテラルおよびUTF-8文字列リテラルは、ナロー文字列リテラルとも呼ばれます。狭い文字列リテラルの型は「arrayofnconst char」です。ここで、nは以下に定義する文字列のサイズであり、静的な保存期間があります。

このタイプのオブジェクトは、一時的なものであり、静的な保存期間(5.19 / 2、上記のスニペットの直後)ではない場合にのみ、インデックスを作成できるように思われます。

[constexpr左辺値から右辺値への変換を許可]…定数式で初期化された、存続期間が終了していない不揮発性一時オブジェクトを参照するリテラル型のglvalue

一時オブジェクトの左辺値を取ることは通常「不正行為」であるため、これは特に奇妙です。このルールは、次のような参照型の関数の引数に適用されると思います。

GCC 4.7は、その価値については受け入れますが、「'._0'の値は定数式では使用できない」ためget_1( "hello" )拒否します…それでも、ケースラベルまたは配列バインドとして受け入れられます"hello"[1]"hello"[1]

ここでいくつかの標準的なヘアを分割しています…分析は正しいですか、そしてこの機能の設計意図はありましたか?

編集:ああ…これにはいくつかの動機があります。この種の式は、プリプロセッサでルックアップテーブルを使用する唯一の方法のようです。たとえば、これにより、SOME_INTEGER_FLAG1または5でない限り無視されるコードのブロックが導入され、6より大きい場合は診断が行われます。

この構成は、C++11の新機能です。

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

c++ - 定義順序による「驚くべき」定数の初期化

constexprに関するスライドを読むときの紹介は、「constsを使用した驚くほど動的な初期化」に関するものです。例は

残念ながら、オーディオトラックが欠落しているので、メモも欠落しているので、ここで何を意味しているのかを推測することしかできません。

以前に定義されdているため、動的に「驚くほど」初期化されるのは正しいですか?S::c d宣言S::cdであるということはおそらく十分ではありません、コンパイラは完全な定義を必要としますね?

そうは言っても、次の例でd 静的に初期化されるのではないかと思います。

そして、ケーキを取るために、C ++ 11では、完全な静的初期化のために何が必要でしょうか?constexprS::cdまたは両方?