2013-03-10 13 views

risposta

14

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 :-)

6

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.

+1

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. –

+1

Non ho mai sentito "zero-st", ma ho sentito "zero-th" ... che non rende corretto l'inglese però :) –

+0

@AndyProwl sì, non è davvero convincente. Puoi per favore modificarlo? Sono su cellulare ed è un dolore. – pmr

-1

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.

+0

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.) –

3

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.

+0

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. –