排序健全性检查

Adr*_*thy 4 c++ sequence-points

我的问题的上下文是一个简单的基于堆栈的虚拟机的实现.我对加法和乘法运算的实现如下所示:

    case OP_ADD: Push(Pop() + Pop()); break;
    case OP_MUL: Push(Pop() * Pop()); break;
Run Code Online (Sandbox Code Playgroud)

由于加法和乘法是可交换操作,只要第一个Pop调用(无论哪个是)的副作用(即,更新虚拟机的堆栈指针)将被完成,所以评估Pop调用的顺序并不重要.在另一个Pop电话之前.

通过减法和除法,顺序确实重要,因此我们必须确保控制首先执行哪个Pop.例如,这是减法操作的实现:

    case OP_SUB: {
        const auto subtrahend = Pop();
        const auto minuend = Pop();
        Push(minuend - subtrahend);
        break;
    }
Run Code Online (Sandbox Code Playgroud)

我听说模糊的说法C++ 17已经收紧了序列点和排序规则,但我没有听到细节.在这方面,我不再是语言律师自信地解析规范了.

C++ 17中的更改是否提供了足够的排序保证,减法可以作为单个表达式实现,如加法和乘法?Pop()调用的顺序及其副作用是定义的,实现定义的还是未指定的?

Lig*_*ica 6

没有.

其中一个重大变化是某些运算符,例如移位运算符,它们从左到右进行了评估,这会影响流插入.但是不包括减法运算符.

老实说,即使不是这种情况,我仍然会推荐你现在拥有的代码,因为当人类阅读时,它显然是正确的,这种方式依赖于深奥的排序规则.