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

Wenn es ausgeführt wird, wird "Yo: platypus" ausgedruckt. Es scheint, zusätzliche Parameter vollständig zu ignorieren. Ich würde erwarten, einen Kompilierfehler zu bekommen. Ich habe auf diese Weise versehentlich einen Fehler in meinen Code eingefügt.Warum kann eine Boost.Bind-Funktion mit zusätzlichen Parametern aufgerufen werden?

Antwort

2

Ich weiß nicht, warum das erlaubt ist, aber ich weiß, dass es erwartetes Verhalten ist. Von here:

binden kann mit mehr als zwei Argumenten Funktionen handhaben, und ihr Argument Substitutionsmechanismus ist Allgemein:

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) 

beachte, dass in dem letzten Beispiel des Funktionsobjekt produced by bind (g, _1, _1, _1) enthält keine Verweise auf andere Argumente als , kann aber immer noch mit mehr als einem Argument verwendet werden. Alle zusätzlichen Argumente werden stillschweigend ignoriert (Hervorhebung meins), nur wie das erste und das zweite Argument werden im dritten Beispiel ignoriert.

+0

Ich würde immer noch gerne die Gründe dafür, warum dieses Verhalten zu erlauben, wenn jemand es erfährt :) –

+0

@Joseph: Wahrscheinlich einfach zu komplex, um es ausdrücklich zu verbieten. –

0

Ich wette, es schafft die gebundene Funktion als variadic Funktion, wie printf.

+1

Nein. Die Anzahl der Argumente hat einen festen Wert, [implementation-defined limit] (http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html#NumberOfArguments). Das aktuelle Limit ist neun. –