Table of Contents

ベストプラクティス: const型修飾子を、修飾したい型の右側に置きます。

int var: // varはint型
int const var: // varはconst int型

int * ptr; // ptrはintへのポインター
int const * ptr; // ptrはconst intへのポインター
int * const ptr; // prtはintへのconstポインター
int const * const ptr; // ptrはconst intへのconstポインター

int ** ptr; // ptrはintへのポインターへのポインター
int const ** ptr; // ptrはconst intへのポインターへのポインター
int * const * ptr; // ptrはintへのconstポインターへのポインター
int ** const ptr; // ptrはintへのポインターへのconstポインター
int const * const * const ptr; // ptrはconst intへのconstポインターへのconstポインター

C++のconst型修飾子はまずその左側に適用されます[1]。[1]が存在しない場合は、右側を修飾します[2]。

[1] const [2]

以下は同じ意味です:

int const var:
const int var: // 同じ意味

しかし、ポインターにconstを適用したい場合は複雑になります。

const int * ptr; // 右側を修飾:ptrはconst intへのポインター
int const * ptr: // 左側を修飾:ptrはconst intへのポインター
int * const ptr: // 左側を修飾:ptrはintへのconstポインター

もちろん、これらは正しく動作します。しかし、ソースコードに両方のスタイルがある場合は見苦しくなります。

シンプルな解決策は、型の右側のみにconstを適用することです。つまり、[1]スタイルのみを使用します。

明確なコーディング規則があれば、このような複雑な構文で書かれている場合でも、コードは理解しやすくなります。

int const ** const ptr; // ptrはconst intへのポインターへのconstポインター

注:オープンソースプロジェクトや会社のコードに貢献する場合は、既存のコードの書き方やプロジェクトのコーディング規則に従う方が良いです。

参考文献: