2016-02-02 1 views
11

N4191 Предлагаемые складные выражения для C++. Определение было то, чтоАссоциативность сгиб-выражений

(args + ...) 

является левая складка (т.е. (((a0 + a1) + a2) + ...), и что

(... + args) 

является право раз (т.е. (... + (a8 + (a9 + a10))). Тем не менее, пересмотренный документ N4295 отменил определения слева и правые унарные складки.

Вопрос: что является обоснованием? Кажется более интуитивным (по крайней мере, когда вы привыкли к алфавитам слева направо) для оценки (args + ...) слева направо.

+1

я бы просто спросить Ричарда или Эндрю :) – SergeyA

+1

я не знаю их обоснование, но мне '(... + арг)' выглядит подвыражении левой складки '(((... + a8) + a9) + a10) '. И аналогично '(args + ...)' выглядит как вспомогательное выражение правого сгиба '(a0 + (a1 + (a2 ...))). – user2079303

+0

@ user2079303 Левая ассоциативность 'a + b + c' обычно определяется как (a + b) + c, вы используете противоположное – TemplateRex

ответ

8

От замечания @cpplearner, вот некоторые археология от std-обсуждения

Ср, 4 февраля 2015 года в 1:30 утра, @T.C. wrote:

В N4295, который был на самом деле голосовали в стандарт,

(... op e) является унарным левой раза;

(e op ...) - унарная правая складка;

В N4191, однако,

(e op ...) называется левым раза.

(... op e) называется правой складкой.

Почему поворот на 180 градусов?

И ответ на @RichardSmith

Форма в оригинальной статье была просто опечатка. Вот некоторые причины, по которым определение, был признан в стандарт является правильным:

  1. В формулировке стандарта, (e op ...) имеет подвыражения вида (e_i op <stuff>).Он не имеет подвыражений формы (<stuff> op e_i). Это согласуется со всеми остальными пакетами , где расширение включает в себя повторные экземпляры шаблона .

  2. (e op ... op eN), где eN не является пакетом, должны иметь eN как сокровенный операнд для того, чтобы быть полезным - то есть, он должен быть (e1 op (e2 op (e3 op (... op eN)...))), не (...(((e1 op e2) op e3) op ...) op eN) - и наоборот для (e0 op ... op e). Это позволяет, например, , (string() + ... + things) и (std::cout << ... << things) работать. Для согласованности (e op ...) также должен быть (e1 op (e2 op (...))).

6

Я не могу говорить за предложение, но новые, измененные определения кажутся мне естественными. Мое обоснование для этого состоит в том, что (... + args) является подвыражением левой складки, а (args + ...) является подвыражением правой складки. На самом деле первый является конечным сегментом, а последний является начальным сегментом выражения (я не могу использовать правильную терминологию).

Вот как я бы иллюстрировать расширение складки от синтаксиса:

левого складывают

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

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

Правого сгиба

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^