The r-value modifier

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.

Get C++ High Performance now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.