13

C++ のほとんどすべては 0 ベースであり、1 ベースではありません。好奇心から、なぜプレースホルダーは 1 ベースなのですか? つまり、_0 ではなく _1 が最初のパラメーターです。

4

4 に答える 4

16

それがその方法boost::bindであり、Boost.Bind の作成者がそれを TR1 に追加する提案を書き、それが標準にコピーされたからです。

Boost.Bind がそのようにする理由についてはわかりませんが、STL に由来する 1998 年の標準に一致する可能性があると推測する危険がありstd::bind1stますstd::bind2nd。そのコンテキストでは、「1st」、つまり「first」が正しいです (ゼロベースのインデックス システムでも、インデックス 0 のアイテムは最初のアイテムであり、0 番目のアイテムではありません)。

したがって、プレースホルダーは、、、などである必要がありますが、序_1st一貫性のない接尾辞を知らない非英語話者にとっては、覚えやすいでしょう。_2nd_3rd_4th_1_2

勝手な推測ですが。この質問は私には思いつかなかったので、今では私も興味があります:-)

于 2013-03-10T21:11:02.930 に答える
6

この規則は、おそらく前身の Boost.bind から引き継がれたものです。

Boost ライブラリが 1 から始めることを選択した理由について: C++03 の一部であったバインダーは、型名として first_argument と second_argument を使用していました。

C++ 標準ライブラリにはbind1st()bind2nd()があったため、n 項関数の自然な一般化は "3 番目にバインド"、"4 番目にバインド" などでした。

どちらも本当の理由ではありませんが、ありそうな説明を提供します。

于 2013-03-10T21:08:42.357 に答える
5

これに対する利点は、 の働きですstd::is_placeholder。結果は true または false だけではなく、プレースホルダー自体の値です。

std::is_placeholder<_1>::value == 1
std::is_placeholder<_2>::value == 2
std::is_placeholder<_7>::value == 7

ただし、プレースホルダー以外は評価され0ます (もちろん、これは false です)。プレースホルダーが_0これで始まった場合、機能しません。

于 2015-07-08T02:13:55.390 に答える
0

ブースト バインド ライブラリの設計者は、MSDOS バッチ構文のファンでした。

バッチ構文で%1は、最初の引数、%22 番目、%33 番目などを参照します。ただし、%は有効な C++ 識別子ではないため、_.

MSDOS バッチ構文で%0は、バッチ ファイルの名前を参照します。この場合、、など_0を呼び出す関数にバインドされます。_1_2_3

実際、いいえ、そうではありません。

于 2013-03-10T22:50:52.910 に答える