Auftakt:
std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
C ++ 1z führt eine Syntax für strukturierte Bindungen ein, die das Schreiben anstelle von ermöglicht
int a, b, c;
std::tie(a, b, c) = f();
etwas wie
auto [a, b, c] = f();
Es std::tie
darf jedoch auch angegeben werden std::ignore
, bestimmte Komponenten zu ignorieren, z.
std::tie(a, b, std::ignore, c) = g();
Wird es möglich sein, mit der neuen Syntax für strukturierte Bindungen etwas Ähnliches zu tun? Wie würde es funktionieren?
c++
language-lawyer
c++17
jotik
quelle
quelle
std::ignore
, denke ich. Da wir die Kopierelision garantiert haben, wird die Dummy-Variable initialisiert. mitstd::tie
wird das temporäre Elementstd::ignore
initialisiert , das sich am Anfang der Zuweisung befindet.auto[IGNORE]
, das einen eindeutigen Namen generiert (z. B. mit compilerspezifischem COUNTER oder LINE ). Es wäre lesbar genug und würde in der Praxis wiestd::ignore
für funktionierenstd::tie
.get
zurückgibt.Antworten:
Der Vorschlag für strukturierte Bindungen enthält einen eigenen Abschnitt zur Beantwortung Ihrer Frage ( P0144R2 ):
Beachten Sie jedoch, dass der Arbeitsentwurf des Standards derzeit von den zuständigen nationalen Stellen (NB) überarbeitet wird und ein NB-Kommentar diese Funktion anfordert ( P0488R0 , US100):
quelle
std::ignore
in strukturierten Bindungen gibt.Nein. Sie müssen nur einen Variablennamen erstellen, der später nicht erwähnt wird.
quelle
-Wunused-variable
Sie können eine nicht verwendete Variablenwarnung generieren , die Sie verwenden können. Dies[[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);
bedeutet jedoch, dass eine von ihnen möglicherweise nicht verwendet wird. Sie wissen nicht, welche. Für diesen Fall gibt es derzeit keine gute Lösung. hoffentlich wird es in c ++ 20 verbessert. von hier genommen: stackoverflow.com/questions/41404001/…(void)dummy;
keine gute Lösung" : Das stimmt nicht ganz: Sie können einfach die Warnung für nicht verwendete Variablen entfernen, ohne die anderen Variablen zu beeinflussen.