12

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

(args + ...)

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

(... + args) 

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

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

4

2 に答える 2

10

@cplearner のコメントから、std-discussion の考古学をいくつか紹介します

2015 年 2 月 4 日水曜日の午前 1 時 30 分に、@TC は次のように書いています。

実際に標準に投票されたN4295では、

(... op e)単項左折畳です。

(e op ...)単項右折です。

ただし、N4191 では、

(e op ...)左折といいます。

(... op e)右折といいます。

なぜ180度回転するのですか?

そして@RichardSmithによる答え

元の論文のフォームは単にタイプミスでした。標準に投票された定義が正しいものである理由を次に示します。

  1. 標準の定式化で(e op ...)は、形式の部分式があり(e_i op <stuff>)ます。形式の部分式はありません(<stuff> op e_i)。これは、展開がパターンの繰り返しインスタンスを含む他のすべてのパック展開と一致しています。

  2. (e op ... op eN)eN非パックであり、eN有用であるためには最も内側のオペランドとして持つ必要があります。つまり、そうである必要はあり ませ(e1 op (e2 op (e3 op (... op eN)...)))ん。これにより、たとえばとが機能します。一貫性を保つために、も である必要があります。(...(((e1 op e2) op e3) op ...) op eN)(e0 op ... op e)(string() + ... + things)(std::cout << ... << things)(e op ...)(e1 op (e2 op (...)))

于 2016-02-03T15:31:58.660 に答える