問題タブ [fold-expression]

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 に答える
596 参照

c++ - 左折式が右折式の出力を反転しないのはなぜですか?

私は C++17の折り畳み式を調べていますが、なぜ次のプログラムが出力されるのか疑問に思っています。

両方のfor_each呼び出しに対して

Live Example

2番目のfold式は数値を逆順に出力するためのものだと思っていました

結果が同じなのはなぜですか?

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

c++ - Clang とバイナリ フォールド式 — 空のパラメーター パックの呪い

具体的には、現在 Coliru によってホストされている Clang 3.6.0 です。

これらのスニペットはすべて次から呼び出されます。

次のコード:

次のコンパイル エラーが発生します。

だから私は式の周りに括弧を入れてみました:

動作しますが、警告が表示されます:

そこで、関数スタイルのキャストを使用して式の値を破棄しようとしましたvoid:

しかし :

私も試してみましたstatic_castが、同じ結果でした。

だから私は代わりにCキャストで試しました:

しかしその後 :

...そして私の出力は----次のとおりfoo(1, 2, 3);です。もう出力されません!

Clang は将来の標準からの邪悪な力によって呪われているのでしょうか、バグがあるのでしょうか、それとも問題は私の椅子に座っているのでしょうか?

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

c++ - フォールド式内で部分式を使用できますか?

以下は正しい折り方ですか?

clangでコンパイルされますが、 gccではコンパイルされません

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

c++ - 折り畳み式は、制約の半順序付けでどのように使用されますか?

§14.10.3 N4553 の制約による部分的な順序付け [temp.constr.order]、概念と論理演算子で形成された制約式を部分的に順序付けて、オーバーロードの場合に最適な実行可能な関数を選択するために使用する必要があることを指定しています。しかし、これは論理演算子の折り畳み式を使用した制約式にも当てはまりますか?

たとえば、ここであいまいな過負荷エラーを出す gcc は正しいですか、それとも "c" を出力するコードは有効ですか?

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

c++ - フォールド式の結合性

N4191は、C++ に fold-expression を提案しました。そこにあった定義は

は左折です (つまり(((a0 + a1) + a2) + ...), そして

は右折りです (つまり(... + (a8 + (a9 + a10)))。ただし、改訂された論文N4295では、左右の単項折りの定義が逆になっています。

質問: 根拠は何ですか? 左から右に評価する方がより直感的です (少なくとも左から右のアルファベットに慣れている場合) (args + ...)

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

c++ - 折り畳み式は C++14 または C++1z の機能ですか?

https://isocpp.org/std/the-standardは、ワーキング ドラフトN4296と述べています。

C++14 標準に加えて、マイナーな編集上の変更が含まれています。

N4296 §5.1.3 に「折り畳み式」の仕様が含まれていることに注意しました。これは公式の C++14 標準にならない機能だと思いました。

フォールド式は C++14 の一部ですか、それとも N4296 でのこの追加は、これらのマイナーな編集上の変更の 1 つですか?

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

c++ - C++17 での式の折り畳み - 比較演算子のユースケース

N4295によると、C++17 を使用すると、未知数の引数の合計を次のように計算できます。

ドキュメントには、+ の代わりに == や > などの演算子を使用できるとさらに記載されています。そのような構成で == または > を使用したい場合の賢明な例を誰か思いつくことができますか?

(私は人々が == と > を定義して奇妙なクラスに奇妙なことをすることができることを認識していますが、それは確かに良い習慣に違反しています. 書くa > b > c > dことは決して良い考えではありませんね?)

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

c++ - GCC がアンパック (I < ...) 式を間違った方法で折りたたむ

GCC にバグを報告しましたが、私の予想が正しいかどうか知りたいです。

この提案と次の折り畳み式を検討してください。

次と同等である必要があります。

次のコードを検討してください。

アサートはコンパイルされ、適切に動作し、失敗しません (確かに、結果が ((0 < 42) and (42 < 3)) ではないことに注意してください。式自体は非常に珍しく無意味です)。
一方、fold 式を使用する場合:

アサートはコンパイル時に失敗します (GCC 6.1.0)。
提案に含まれているもののために、それがコンパイルされることを期待しています。
折り畳み式を含まない上記の例と同等であるため、成功するはずです。
アンパックされた式は、((0 < 42) < 3) である必要があります。

私は正しいですか、それとも折り畳み式についてここで重要なことを見逃していますか?