字符串化运算符的未指定计算顺序

Pot*_*ter 5 c++ operator-precedence stringification c-preprocessor

一元运算符通常以比二元运算符更高的优先级进行解析,并且当从左到右扫描时,将首先找到前缀运算符。那么为什么 stringize ( #) 运算符的计算顺序相对于连接 ( ##) 运算符是未指定的呢?评估顺序是否意味着与 [cpp.stringize] \xc2\xa716.3.2 上下文中的优先级不同?

\n\n

(预处理器没有副作用,因此从技术上讲,它没有评估顺序之类的东西。)

\n\n

考虑到任何替代方案都会字符串化串联结果,而不是参数本身,文本“替换为包含相应参数的预处理标记序列的拼写的单个字符串文字预处理标记”的文本如何与其他优先级相匹配?

\n\n

是否有任何实现做了一些有趣的事情,或者可以安全地删除评估文本的顺序并替换为“#运算符比运算符具有更高的优先级##”?

\n\n

该问题已交叉发布到标准讨论邮件列表,但请更愿意在此处回复。

\n\n

注意:我计划起草一份官方提案来修改这部分 C++ 规范,所以请分享您的知识!潜在的动机是使预处理器更具确定性。

\n

Pot*_*ter 3

我希望看到另一个答案,但根据 @R 的评论,我倾向于认为该标准的含义正是它所说的。由于没有副作用,求值顺序在预处理器中没有影响,因此不应指定。#应指定和的优先级和结合性##,但在标准中省略了。

每个术语“关联性”“优先级”和“求值顺序”都具有相互排斥的含义,并且标准应高于反驳它们的标准。

编辑:我已正式提议解决此问题。(参见第 5.1 节。)