Ответ 1
Из комментария @cpplearner, здесь некоторая археология из std-обсуждения
Вкл, 4 февраля 2015 года в 1:30 утра, @T.C. написал:
В N4295, который фактически был проголосован за стандарт,
(... op e)
является унарной левой складкой;
(e op ...)
является унарной правой складкой,В N4191, однако,
(e op ...)
называется левой складкой.
(... op e)
называется правой складкой.Почему поворот на 180 градусов?
И ответ @RichardSmith
Форма в оригинальной статье была просто опечаткой. Вот некоторые причины, по которым определение, которое было проголосовано в стандарте, является правильный:
В стандартной формулировке
(e op ...)
имеет подвыражения вида(e_i op <stuff>)
. Он не имеет подвыражений форма(<stuff> op e_i)
. Это согласуется со всеми остальными пакетами расширений, где расширение включает в себя повторяющиеся экземпляры шаблон.
(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 (...)))
.