Pointers are more powerful than references in the sense that they allow two things that references don’t: nullability and rebinding.

Summary

  • References cannot be null and cannot rebind
  • std::reference_wrapper cannot be null but can rebind
  • Pointers can be null and can rebind (and can do low-level address manipulations)
  • boost optional references can be null and can rebind (but are incompatible with std::optional)

https://www.fluentcpp.com/2018/10/02/pointers-references-optional-references-cpp/