Proxy objects
Proxy objects are internal library objects that aren't intended to be visible to the user of the library. Their task is to postpone operations until required and to collect the data of an expression until it can be evaluated and optimized. However, proxy objects act in the dark; the user of the library should be able to handle the expressions as if the proxy objects were not there.
In other words, using proxy objects, you can encapsulate optimizations in your libraries while leaving the syntax intact—more or less, a free lunch.
Comparing concatenated strings using a proxy
Take a look at this code snippet, which concatenates two strings and compares the result:
auto func_a() {
auto a = std::string{"Cole"};
auto b = std::string{"Porter"};
auto c = std::string{"ColePorter"};
auto is_cole_porter = (a + b) == c;
// is_cole_porter is true
}
Here is a visual representation of the preceding code snippet:

Accumulating two strings into a new string
The problem, here, is that...