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()调用的顺序及其副作用是定义的,实现定义的还是未指定的?