2010-07-23 2 views
7
#include <iostream> 
#include <string> 

#include <boost/bind.hpp> 

void foo(std::string const& dummy) 
{ 
    std::cout << "Yo: " << dummy << std::endl; 
} 

int main() 
{ 
    int* test; 
    std::string bar("platypus"); 
    (boost::bind(&foo, bar))(test, test, test, test, test, test, test, test); 
} 

Quando eseguito, esso stampa, "Yo: ornitorinco." Sembra ignorare completamente i parametri extra. Mi aspetterei di ottenere un errore di compilazione. Ho accidentalmente introdotto un bug nel mio codice in questo modo.Perché è possibile chiamare una funzione BoostBind con parametri aggiuntivi?

risposta

2

Non so perché questo è consentito, ma so che è un comportamento previsto. Da here:

bind può gestire funzioni con più di due argomenti, e il suo meccanismo di sostituzione tesi è più generale:

bind(f, _2, _1)(x, y);     // f(y, x) 
bind(g, _1, 9, _1)(x);     // g(x, 9, x) 
bind(g, _3, _3, _3)(x, y, z);   // g(z, z, z) 
bind(g, _1, _1, _1)(x, y, z);   // g(x, x, x) 

noti che, nell'ultimo esempio, l'oggetto funzione prodotto da bind (g, _1, _1, _1) non contiene riferimenti a tutti gli argomenti oltre il prima, ma per essere utilizzato con più di un argomento. Eventuali argomenti aggiuntivi vengono ignorati automaticamente (emphasis mine), solo come il primo e il secondo argomento vengono ignorati nel terzo esempio.

+0

Mi piacerebbe ancora conoscere il ragionamento sul perché consentire questo comportamento se qualcuno lo scopre :) –

+0

@Joseph: Probabilmente troppo complesso per impedirlo esplicitamente. –

0

Scommetto che è la creazione della funzione di limite come una funzione variadic, come printf.

+1

Nope. Il conteggio degli argomenti ha un limite [definito dall'implementazione] fisso (http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html#NumberOfArguments). Il limite attuale è nove. –