Ich habe eine bug GCC geöffnet, aber ich würde gerne wissen, ob ich richtig in meinen Erwartungen bin.GCC entpackt (I <...) Ausdruck falscher Ausdruck
Betrachten this Vorschlag und die folgende fold Ausdruck:
(args < ...)
Es sollte gleichwertig sein:
((args$0 < args$1) < ...) < args$n
den folgenden Code vor:
#include <cassert>
int main() {
assert((0 < 42) < 3);
}
Die assert kompiliert und Werke richtig, es scheitert nicht (wie erwartet, beachten Sie, dass das Ergebnis ist nicht ((0 < 42) und (42 < 3)), der Ausdruck selbst ist ziemlich ungewöhnlich und bedeutungslos).
Auf der anderen Seite, bei der Verwendung einer Falte Ausdruck:
template<int... I>
static constexpr bool f() {
return (I < ...);
}
int main() {
static_assert(f<0, 42, 3>(), "!");
}
Die assert fails bei der Kompilierung (GCC 6.1.0).
Ich würde erwarten, dass es aufgrund dessen kompiliert, was in dem Vorschlag enthalten ist.
Es sollte erfolgreich sein, denn es entspricht dem obigen Beispiel, das keine falten Ausdrücke enthält.
Der entpackte Ausdruck sollte in der Tat sein: ((0 < 42) < 3).
Habe ich Recht oder mir fehlt hier etwas Wichtiges über Faltexpressionen?
Die Art, wie ich daran erinnern, ist, dass "(STD :: Cout << ... << x)" sollte das Richtige tun "(d. H. Eine linke Falte). Dann nehmen Sie die 'std :: cout 'und' (... op x) 'ist eine linke Falte auch. –