2016-02-02 12 views
11

N4191 schlug Falteausdrücke zu C++ vor. Die Definition war, dassAssoziativität von Falteausdrücken

(args + ...) 

ist ein linkses fach (dh (((a0 + a1) + a2) + ...), und dass

(... + args) 

ist ein rechts-fach (dh (... + (a8 + (a9 + a10))). Allerdings ist das überarbeitete Papier N4295 umgekehrt die Definitionen von links und rechts unäre Falten

Frage: was ist die Begründung? Es scheint intuitiver (zumindest wenn Sie gewohnt sind, von links nach rechts Alphabete) zu bewerten (args + ...) von links nach rechts.

+1

Ich würde nur Richard oder Andrew frage :) – SergeyA

+1

Ich weiß nicht, ihre Gründe, aber mir '(... + args)' sieht aus wie ein Unterausdruck der linken Falte '(((... + a8) + a9) + a10) '. Und ähnlich ((args + ...) 'sieht aus wie ein Unterausdruck der rechten Falte' (a0 + (a1 + (a2 ...))) '. – user2079303

+0

@ user2079303 Links-Assoziativität von 'a + b + c' ist gemeinhin definiert als (a + b) + c, Sie verwenden das Gegenteil – TemplateRex

Antwort

8

Aus dem Kommentar von @cpplearner falten, hier einige Archäologie von STD-Diskussion

Am Mi, 4. Februar 2015 um 01:30 Uhr, @T.C. wrote:

In N4295, die in den Standard wurde tatsächlich stimmte

(... op e) ist eine einstellige links falten;

(e op ...) ist ein unärer Rechtsfalz;

In N4191 jedoch

(e op ...) ist eine linke Falte genannt.

(... op e) heißt eine rechte Falte.

Warum die 180-Grad-Kurve?

Und die Antwort von @RichardSmith

Die Form, in der Originalarbeit war einfach ein Tippfehler. Hier sind einige Gründe, warum die Definition, die in den Standard gewählt wurde, ist die richtige:

  1. in der Formulierung des Standard (e op ...) Unterausdrücke der Form hat (e_i op <stuff>).Es hat keine Unterausdrücke der Form (<stuff> op e_i). Dies ist konsistent mit allen anderen Erweiterungen des Pakets , wobei die Erweiterung wiederholte Instanzen des Musters umfasst.

  2. (e op ... op eN), wo eN ein nicht-Pack ist, eN als innerste Operanden, um nützlich zu sein, müssen - für (e0 op ... op e) und umgekehrt - das heißt, es muss (e1 op (e2 op (e3 op (... op eN)...))), nicht (...(((e1 op e2) op e3) op ...) op eN) sein. Dies ermöglicht, zB , (string() + ... + things) und (std::cout << ... << things) zu arbeiten. Aus Konsistenzgründen muss (e op ...) auch (e1 op (e2 op (...))) sein.

6

Ich kann nicht für den Vorschlag sprechen, aber die neuen, vertauschten Definitionen scheinen mir natürlich. Mein Grund dafür ist, dass (... + args) eine Unterexpression einer linken Falte ist und (args + ...) ein Unterausdruck einer rechten Falte ist. Tatsächlich ist das erstere das letzte Segment, und das letztere ist das anfängliche Segment des Ausdrucks (ich verwende möglicherweise nicht die korrekte Terminologie).

Hier ist, wie ich die Erweiterung der Falte von der Syntax zeigen würde:

links falten

     (... + args) 
      (... + args) + a999) 
    (... + args) + a998) + a999) 

((...((a0 + a1) + a2)...) + a999) 

Rechts

(args + ...) 
(a0 + (args + ...) 
(a0 + (a1 + (args + ...) 

(a0 + (...(a997 + (a998 + a999))...))