Points often cited as disadvantages of references include:
- There's nothing that clearly distinguishes them from regular variables at the point of use. They can therefore obscure the fact that you're not passing by value or mutating a local/member variable (particularly if you don't have good IDE support, and good IDE support for C++ is damn hard for some environments/toolchains/targets)
- There is no concept of a null reference, which can create friction with interfaces that use NULL for optional parameters
These points are also often cited as crucial advantages of references. So it goes.
The first can be a legitimate complaint, although I find it's rarely an issue in practice.
If you need the equivalent of a nullable reference, you can just use std::optional<std::reference_wrapper<T>> instead and make the nullability explicit.