Summary
In this post, I will introduce const, * and & and their combinations. I also have similar posts discussed auto and &.
Conclusion
As usual, I present the golden rule first: “read from right to left”. In other words, the const-on-the-right style always puts the const on the right of what it constifies”.
- When you want a pointer which can not change the object, use
CNN const * cnn_ptr = new CNN(model);; - When you want a pointer which can not point to other objects, use
CNN * const cnn_ptr = new CNN(model);; - When you want a pointer which can not change the object and can not point to other objects, use
CNN const * const cnn_ptr = new CNN(model); - When you want a reference which can not change the object, use
CNN const & cnn_ref = model;;
Details
1. const CNN * or CNN const *
Read it from right to left. CNN const * cnn_ptr means “cnn_ptr points to an CNN instance that is const”: the CNN object can’t be changed via cnn_ptr. CNN const * cnn_ptr is equivalent to CNN const * cnn_ptr. However, I prefer the former, which is the const-on-the-right style.
The const-on-the-right is a consistent style: it always puts the const on the right of what it constifies. In which, a local variable that is const is defined with the const on the right: int const a = 42;. Similarly a static variable that is const is defined as static double const x = 3.14;. Basically every const ends up on the right of the thing it constifies.
2. CNN * const cnn_ptr
Read it from right to left. CNN * const cnn_ptr means “cnn_ptr is a const pointer to an CNN instance that is non-const”: you can’t change the pointer cnn_ptr itself, but you can change the CNN object via the cnn_ptr. const constifies *, which makes us happy.
3. CNN const * const cnn_ptr
Read it from right to left. It means “cnn_ptr is a const pointer to an CNN instance that is const”: you can’t change the pointer cnn_ptr itself, nor can you change the CNN instance via cnn_ptr.
4. CNN const & cnn_ref
Read it from right to left. “cnn_ref is a reference to a const CNN”. CNN const & cnn_ref is equivalent to const CNN & cnn_ref.
5. CNN & const cnn_ref ???
“cnn_ref is a const reference to a CNN”? It makes no sense. Once combined, cnn_ref can not combine other instances. That is, CNN& const cnn_ref is always equivalent to CNN& cnn_ref.