C++ のほとんどすべては 0 ベースであり、1 ベースではありません。好奇心から、なぜプレースホルダーは 1 ベースなのですか? つまり、_0 ではなく _1 が最初のパラメーターです。
4 に答える
それがその方法boost::bind
であり、Boost.Bind の作成者がそれを TR1 に追加する提案を書き、それが標準にコピーされたからです。
Boost.Bind がそのようにする理由についてはわかりませんが、STL に由来する 1998 年の標準に一致する可能性があると推測する危険がありstd::bind1st
ますstd::bind2nd
。そのコンテキストでは、「1st」、つまり「first」が正しいです (ゼロベースのインデックス システムでも、インデックス 0 のアイテムは最初のアイテムであり、0 番目のアイテムではありません)。
したがって、プレースホルダーは、、、などである必要がありますが、序_1st
数の一貫性のない接尾辞を知らない非英語話者にとっては、覚えやすいでしょう。_2nd
_3rd
_4th
_1
_2
勝手な推測ですが。この質問は私には思いつかなかったので、今では私も興味があります:-)
この規則は、おそらく前身の Boost.bind から引き継がれたものです。
Boost ライブラリが 1 から始めることを選択した理由について: C++03 の一部であったバインダーは、型名として first_argument と second_argument を使用していました。
C++ 標準ライブラリにはbind1st()
とbind2nd()
があったため、n 項関数の自然な一般化は "3 番目にバインド"、"4 番目にバインド" などでした。
どちらも本当の理由ではありませんが、ありそうな説明を提供します。
これに対する利点は、 の働きです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
これで始まった場合、機能しません。
ブースト バインド ライブラリの設計者は、MSDOS バッチ構文のファンでした。
バッチ構文で%1
は、最初の引数、%2
2 番目、%3
3 番目などを参照します。ただし、%
は有効な C++ 識別子ではないため、_
.
MSDOS バッチ構文で%0
は、バッチ ファイルの名前を参照します。この場合、、など_0
を呼び出す関数にバインドされます。_1
_2
_3
実際、いいえ、そうではありません。