Załóżmy, że mam funkcję, która pobiera dwa argumenty,Dlaczego obiekty zwracane przez bind ignorują dodatkowe argumenty?
void f(int x, int y);
i chcę się wiązać z nich. Mogę użyć std::bind
następująco:
auto partiallyBoundF = std::bind(f, 10, _1);
partiallyBoundF
trwa tylko jeden argument, ale mogę nazwać to z więcej niż jednego. Argumenty poza pierwszy nawet nie muszą być typu, który ma sensu:
partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
Co jest celem pozwalających obiektów zwracanych z bind
być przekazywane dodatkowe argumenty? Umożliwia wywoływanie błędów podczas kompilacji, które mogłyby zostać odrzucone w innym miejscu.
Jaki kompilator? Sądzę, że może to być po prostu niezgodny kompilator (ponieważ zezwolenie na te dodatkowe argumenty naprawdę nie ma sensu i wątpię, aby standard to umożliwiał). Na przykład MSVC emuluje szablony variadyczne, definiując po prostu każdy szablon wielościenny, aby pobrać maksymalnie możliwe argumenty z szablonu i przypisać je do pewnego typu NIL. Może coś takiego jest przyczyną twojego zachowania? –
@ ChristianaRau: To część standardu. To także była część TR1. 20.8.2/4 komentuje, że spodziewana implementacja jest dla '' operator() 'z prefiksem variadycznym, aby po prostu brać wszystko, co jest do niego przekazywane, niezależnie od typu lub liczby argumentów. TR1 ma podobne brzmienie. – KnowItAllWannabe
W twoim przypadku f (w1, ..., wN) gdzie 'N = sizeof ... (bound_args)' (liczba argumentów do wywołania wiązania) będzie poprawnym wyrażeniem, patrz 20.8.9.1.2/2 i 20.8.2/1. Edycja: NIE uniemożliwia żadnego innego połączenia. – dyp