Is it true that the overloaded assignment operator is always provided by the C++ compiler.
If you don't declare your own assignment operator, the compiler will implicitly declare one for you (always). If you use it, then the compiler will also implicitly define it (always).
There is a common misunderstanding shown in Als's answer that it will not be defined under some conditions. That is wrong, whether the type has constant members or references does not matter at all, the compiler will declare and define it. The situation for those cases is that the implicitly defined compiler will fail to compile.
If you try that in a compiler, the error will not point to a missing assignment operator, but rather to an error while compiling the implicitly defined assignment.