Warum kann std :: apply ein Lambda aufrufen, aber nicht die entsprechende Vorlagenfunktion?

RandomBits

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?

Ap31

Der Unterschied zwischen den beiden ist , dass peine 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 pals 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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Ich kann die Vorlagenfunktion nicht direkt an std :: apply übergeben, aber ich kann über Lambda

Warum kann ich ein On-VPC-Aws-Lambda von einem Off-VPC-Aws-Lambda aufrufen, aber nicht umgekehrt?

Warum kann sich ein generisches Lambda nicht selbst aufrufen, aber wenn es in eine Klasse eingeschlossen wird, ist dies möglich?

Warum kann die Vorlagenfunktion in C ++ nicht teilweise spezialisiert werden?

Aufrufen der Nicht-Vorlagenfunktion über die Vorlagenfunktion

Warum wird die Argumentkonvertierung beim Aufrufen einer Vorlagenfunktion nicht berücksichtigt?

Warum kann ich GetType () für ein leeres Array aufrufen, aber nicht, wenn es von einer Funktion zurückgegeben wird?

Kann ein Lambda eine Vorlagenfunktion instanziieren?

Warum kann meine Vorlagenfunktion nicht eingebunden werden?

Warum kann ich ein Lambda mit einem nicht kopierbaren Klassenparameter nicht in eine std::function konvertieren?

Warum wählt die Überlastungsauflösung nicht die std :: vector-Überladung meiner Vorlagenfunktion aus?

Warum bringt mich React Router zum richtigen Pfad, zeigt aber nicht die entsprechende Komponente an?

Warum kann ich private Methoden über Object#send aufrufen, aber diese Methoden nicht direkt aufrufen?

Warum kann ich keine Nicht-Const-Member-Funktion für ein Element in einem std :: set aufrufen?

Wenn ein Bash-Skript die entsprechende Datei im Verzeichnis auflistet, aber nicht richtig funktioniert?

Warum kann ich beim Kompilieren nicht die Anzahl der Argumente einer Vorlagenfunktion abrufen?

Warum kann ich die Klassenfunktion in addEventListener nicht aufrufen?

Warum ich die zurückgegebene Methode nicht direkt aufrufen kann

Warum kann ich die UseInMemoryDatabase-Methode in DbContextOptionsBuilder nicht aufrufen?

Warum kann ich die Basiskonstruktormethode nicht mit einem Argument aufrufen?

Warum kann ich die Methode nextLine() nicht zweimal in Java aufrufen?

Warum findet std :: sort die entsprechende (statische Element-) Funktionsüberladung nicht?

Warum kann ich ein Elementattribut nicht an scope übergeben. $ Watch, aber ich kann eine Funktion übergeben, die es zurückgibt

Warum kann ich die Funktionssignatur für ein veränderliches Lambda nicht ableiten?

Warum kann ein Lambda die einschließende Funktion nicht zurückgeben?

Warum kann ich ein generisches Array deklarieren, aber nicht initialisieren?

Ich bekomme ein Speicherleck, aber ich kann nicht herausfinden warum

Warum würde eine Sicherheitsregel ein Lesen im Simulator verhindern, aber nicht das entsprechende Lesen von einem JS-Client?

Warum kann ich eine Funktion in C aufrufen, ohne sie zu deklarieren, aber nicht in C ++?

TOP Liste

  1. 1

    So verschieben Sie ein Bild in Flutter/Dart mit einem Draggable

  2. 2

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  3. 3

    TypeAhead.js zeigt keine Ausgangsschienen an?

  4. 4

    Deklarieren einer nicht initialisierten Variablen in der Klassendefinition in Python

  5. 5

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  6. 6

    Interpolieren Sie mit Python die 2D-Matrix entlang der Spalten

  7. 7

    spring-data-jpa: ORA-01795: Die maximale Anzahl von Ausdrücken in einer Liste beträgt 1000

  8. 8

    Warum funktioniert Phantomjs nicht mit dieser Site?

  9. 9

    numpy: Berechnen Sie die Ableitung der Softmax-Funktion

  10. 10

    Wie vermeide ich, dass die gesamte App neu geladen wird, wenn Nav.Link von React-Bootstrap verwendet wird?

  11. 11

    MongoDB eingebettetes Dokument unterscheiden und filtern

  12. 12

    Warum funktioniert das Umgebungslicht in diesem Beispiel nicht?

  13. 13

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

  14. 14

    Python gibt einen Fehler aus, dass eine Datei nicht vorhanden ist, wenn dies eindeutig der Fall ist

  15. 15

    Aktualisieren des Werts im Json-Objekt in Python

  16. 16

    Wie verwende ich Format-Table ohne Abschneiden von Werten?

  17. 17

    Kivy: Machen Sie Scatter gleich groß wie das untergeordnete Etikett oder Bild

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    So vergleichen Sie Werte in verschiedenen Objekten jq

  20. 20

    Teilen Sie die Zeichenfolge durch (') und Leerzeichen, aber lassen Sie alle Leerzeichen zwischen zwei aufeinander folgenden (')

  21. 21

    Überprüfen Sie, ob der ausgewählte Wert 'YES' ist, wenn ja, aktivieren Sie ein Steuerelement mit Javascript

heißlabel

Archiv