Das folgende Code-Snippet (kompiliert mit gcc 6.3.0 unter OS X mit -std = c ++ 17) zeigt mein Rätsel:
#include <experimental/tuple>
template <class... Ts>
auto p(Ts... args) {
return (... * args);
}
int main() {
auto q = [](auto... args) {
return (... * args);
};
p(1,2,3,4); // == 24
q(1,2,3,4); // == 24
auto tup = std::make_tuple(1,2,3,4);
std::experimental::apply(q, tup); // == 24
std::experimental::apply(p, tup); // error: no matching function for call to 'apply(<unresolved overloaded function type>, std::tuple<int, int, int, int>&)'
}
Warum kann der Aufruf des Lambda erfolgreich angewendet werden, nicht jedoch der Aufruf der Vorlagenfunktion? Ist dies das erwartete Verhalten und wenn ja, warum?
Der Unterschied zwischen den beiden ist , dass p
eine Funktionsschablone ist, während q
- ein generisches Lambda - ist so ziemlich ein Verschluss - Klasse mit einem Templat Call - Betreiber .
Obwohl die Definition des Aufrufoperators der Definition sehr ähnlich ist p
, ist die Abschlussklasse überhaupt keine Vorlage, und daher bleibt sie der Auflösung von Vorlagenargumenten für nicht im Wege std::experimental::apply
.
Dies kann überprüft werden, indem p
als Funktorklasse definiert wird :
struct p
{
auto operator()(auto... args)
{ return (... * args); }
};
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen