In the preceding code, the global operator== method only accepts r-values. If we were to accept an l-value, we could end up accidentally misusing the proxy, like this:
auto fail() { auto concat = String("Cole") + String("Porter"); auto is_cole_porter = concat == String("ColePorter"); }
The problem here is that both the Cole and Porter strings are destructed when the comparison is executed, leading to a failure. As we force the concat object to be an r-value, the code will not compile when used like in the preceding code. Of course, you could brute-force it to compile using std::move(concat) == String("ColePorter"), but that wouldn't be a realistic case.