7 Stimmen

Warum kann eine Boost.Bind-Funktion mit zusätzlichen Parametern aufgerufen werden?

#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, gibt es aus: "Yo: Schnabeltier". Es scheint zusätzliche Parameter vollständig zu ignorieren. Ich würde einen Kompilierfehler erwarten. Ich habe auf diese Weise versehentlich einen Fehler in meinen Code eingebaut.

2voto

SCFrench Punkte 8074

Ich weiß nicht, warum dies erlaubt ist, aber ich weiß, dass es ein erwartetes Verhalten ist. Von aquí :

bind kann Funktionen mit als zwei Argumenten umgehen, und sein Substitutionsmechanismus ist allgemeiner allgemeiner:

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)

Beachten Sie, dass in der letzten Funktionsobjekt, das durch bind(g, _1, _1, _1) erzeugte Funktionsobjekt keine Verweise auf andere Argumente als das ersten Argumente enthält, aber es kann trotzdem mit mehr als einem Argument verwendet werden. A Argumente werden stillschweigend ignoriert (Hervorhebung von mir), nur wie das erste und das zweite Argument im dritten Beispiel ignoriert werden.

0voto

Brooks Moses Punkte 8927

Ich wette, es erstellt die gebundene Funktion als variadische Funktion, wie printf .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X