const 付きのポインタ型(C++ の参照 & も同様) const T * と T * const (T は任意の型名)はどう違うのか? というのをよく忘れて検索する羽目になっていましたが、型名の後ろに付くと考えることで忘れなくなりました。
どういうことかというと、まず C/C++ の言語規格で const T * は T const * と同じです。多くの人は(理由はよくわかりませんが) const T * のほうが主で T const * はおまけの書き方だと考えがちですが、実は後者のほうが規則的です。
説明のためにconstがかかる範囲をカッコで括ると、T const * は (T) const * となり、「Tの値はconstだがポインタはconstではない」という意味になります。同様に T * const は (T *) const となり、「Tの値は const ではないがポインタは const である」という意味、T const * const ならば ((T) const *) const で「Tの値は const でありポインタも const である」という意味になります。
表にまとめてみました。こうして比較すると、const T * のように const を前につけるほうが例外的であることがわかります。
| 型 | 意味 |
|---|---|
| T | Tの値は const ではない |
| T const | Tの値が const である |
| const T | Tの値が const である |
| T const * | Tの値は const だがポインタは const ではない |
| const T * | Tの値は const だがポインタは const ではない |
| T * const | Tの値は const ではないがポインタは const である |
| const (T *) | こういう文法は存在しない |
| T const * const | Tの値は const でありポインタも const である |
| const T * const | Tの値は const でありポインタも const である |
| const (const T *) | こういう文法は存在しない |
変数名も含めた別の説明
変数名も含めると、const は型名と変数名の間に入ると言ったほうがわかりやすいかもしれません。
T const *x; は *x (値)が const であり、 T * const x; は x (ポインタ)が const である、となります。
あまりわかりやすくならなかった図↓
