2010-07-23 16 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); 
} 

Cuando se ejecuta, se imprime, "Yo: ornitorrinco". Parece ignorar por completo los parámetros adicionales. Esperaría obtener un error de compilación. Accidentalmente introduje un error en mi código de esta manera.¿Por qué se puede llamar a una función Boost.Bind con parámetros adicionales?

Respuesta

2

No sé por qué esto está permitido, pero sé que es el comportamiento esperado. De here:

bind puede manejar funciones con más de dos argumentos, y su mecanismo de sustitución argumento es más generales:

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) 

Tenga en cuenta que, en el último ejemplo, el objeto función producido por bind (g, _1, _1, _1) no contiene referencias a ningún argumento más allá del primero, pero aún se puede usar con más de un argumento. Cualquier argumento adicional se ignora silenciosamente (énfasis mío), solo como el primero y el segundo argumento se ignoran en el tercer ejemplo.

+0

Todavía me encantaría saber el razonamiento de por qué permitir este comportamiento si alguien se entera :) –

+0

@Joseph: Probablemente demasiado complejo como para no permitirlo explícitamente. –

0

Apuesto a que está creando la función enlazada como una función variadica, como printf.

+1

Nope. El número de argumentos tiene un límite fijo, definido por la implementación, (http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html#NumberOfArguments). El límite actual es nueve. –

Cuestiones relacionadas