Quasi tutto in C++ è 0, non 1 in base. Solo per curiosità, perché i segnaposto 1 sono basati? Significato _1 è il primo parametro, non _0.Perché iniziare con std :: placeholder :: _ 1 anziché _0?
risposta
Perché così è lo boost::bind
e l'autore Boost.Bind ha scritto la proposta per aggiungerla a TR1 e che è stata copiata nello standard.
Per quanto riguarda il motivo per cui Boost.Bind lo fa in questo modo, non lo so, ma mi azzarderei a dire che potrebbe essere quella di abbinare std::bind1st
e std::bind2nd
dallo standard del 1998, che è venuto dal STL. In tale contesto "prima", cioè "prima" è corretta (anche in un sistema di indicizzazione in base zero della voce al indice zero è il primo , non il zeroth, pos.)
così forse il segnaposto deve essere _1st
, _2nd
, _3rd
, _4th
ecc, ma per chi non parla inglese che non conoscono i suffissi incoerenti su ordinal numbers è probabilmente più facile da ricordare _1
, _2
ecc
Solo una supposizione selvaggia però. La domanda non mi era mai venuta in mente quindi ora sono curioso anch'io :-)
La convenzione è stata probabilmente riportata dal predecessore Boost.bind.
Sul motivo per cui la libreria Boost ha scelto di iniziare con 1: i raccoglitori che sono stati parte di C++ 03 hanno utilizzato first_argument e second_argument come nomi di tipi.
La libreria standard C++ aveva bind1st()
e bind2nd()
, quindi una generalizzazione naturale delle funzioni n-ary era "bind 3rd", "bind 4th" e così via.
Nessuno di questi è un vero motivo, ma offrire una spiegazione probabile.
I progettisti della libreria boost bind erano appassionati della sintassi batch di MSDOS.
Nella sintassi batch, %1
si riferisce al primo argomento, %2
il secondo, il terzo %3
, ecc Ma poiché %
non è un identificatore valido C++, hanno sostituito con un _
.
Nella sintassi batch di MSDOS, %0
fa riferimento al nome del file batch. In questo caso, _0
sarebbe associato alla funzione che si chiama _1
, _2
, _3
ecc.
In realtà no, non proprio.
I voti in aumento da quando indovino un sacco di persone non sono mai arrivati all'ultima riga della risposta ... In realtà stavo pensando qualcosa di simile ma serio, riguardo alle shell POSIX ('$ 0',' $ 1', ecc.) –
Un vantaggio è il funzionamento di std::is_placeholder
. Il risultato non è solo vero o falso, è il valore del segnaposto stesso.
std::is_placeholder<_1>::value == 1
std::is_placeholder<_2>::value == 2
std::is_placeholder<_7>::value == 7
ma tutto ciò non è un segnaposto valuterà a 0
(che è ovviamente falsa). Se i segnaposto iniziassero allo _0
, ciò non funzionerebbe.
Mentre questo è vero, si potrebbe facilmente far funzionare con '_0' il valore 1, e' _1' il valore 2, ecc. quindi i segnaposto non hanno ancora il valore 0. –
Non comprerei "non ho mai sentito qualcuno parlare dell'argomento 0st", perché normalmente non parli nemmeno dell'elemento 0st di un array. Dici "1st", ma il suo indice è 0. Tuttavia, l'argomento storico ha senso.La libreria standard disponeva di 'bind1st()' e 'bind2nd()', quindi una generalizzazione naturale delle funzioni 'n'-ary era" bind 3rd "," bind 4th "e così via. –
Non ho mai sentito "zero-st", ma ho sentito "zero-th" ... che non rende corretto l'inglese però :) –
@AndyProwl sì, non è davvero convincente. Puoi per favore modificarlo? Sono su cellulare ed è un dolore. – pmr