Today I saw the Order of Evaluation
section in C++ Primer, and I wished I could’ve learned this earlier!
This section stated that the order of evaluation in C++ is not defined (there are few exceptions), instead it’s totally up to the compiler to decide which operand will be evaluated first.
For instance, int a = f1() * f2()
; There are no guarantees that f1()
will be evaluated first or f2()
will be evaluated first.
Right right, now I recall a bug which took me some time to fix.
While I was working on the DOM Arena bug, I wrote something like this
HTMLElement* element = new(nodeInfo->NodeInfoManager()) HTMLElement(nodeInfo.forget());
A brief explanation to the code is nodeInfo
is a ref-counted smart pointer instance which owns a raw pointer, and nodeInfo.forget()
will make nodeInfo
to lose the ownership, to let it pass the ownership to the caller.
Do you see the problem? Yeah, if nodeInfo.forget()
gets evaluated first, nodeInfo->NodeInfoManager()
will became dereferencing a null pointer, which is invalid.
It was driving me nuts, because I couldn’t understand why and I had the impression that the order of evaluation was from left to right!
Happy Coding!