2016-06-11 6 views
3

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?

+1

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. –

Antwort

4

N4191 war der ursprüngliche Vorschlag. GCC's C++1z status page stellt fest, dass es den überarbeiteten Vorschlag in N4295 umsetzt.

Die Regeln für linke und rechte Falten haben sich geändert, und ich glaube, dass Ihr Code jetzt erforderlich ist, um eine rechte Falte zu erzeugen, d. H. 0 < (42 < 3), die false ist.

I < ... ist eine richtige Falte; ... < I wäre eine linke Falte.

+2

Es hat sich nicht geändert, es war nur ein Tippfehler. Siehe [Assoziativität von Fold-Expressions] (https://stackoverflow.com/questions/35163198/assoziativity-of-fold-expressions) –