This patch re-arranges the + operator overloads and implements P1165R1.
Currently, it is a bit of a WIP because I had some questions about why it is causing tests to fail. I spent a long time trying to debug why test_neg_one fails but couldn't figure it out. I thought maybe @EricWF would know, otherwise I will keep debugging it.
Yes, it should, because in C++03 we don't have move semantics.