多重ポインタの const
の付け方をまとめました。 まずは普通のポインタから。
int main()
{
const int* x = new int(0); // ポインタの指す内容を書き換えることができない
int* const y = new int(0); // ポインタの指すアドレスを書き換えることができない
const int* const z = new int(0); // どちらの操作もできない
*x = 1;
*y = 1;
x = nullptr;
y = nullptr;
return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:5:8: error: read-only variable is not assignable
*x = 1;
~~ ^
sample.cpp:8:7: error: cannot assign to variable 'y' with const-qualified type 'int *const'
y = nullptr;
~ ^
sample.cpp:4:16: note: variable 'y' declared const here
int* const y = new int(0);
~~~~~~~~~~~^~~~~~~~~~~~~~
2 errors generated.
二重ポインタの場合
int main()
{
int** x = nullptr;
const int* const* a = x; // 一重ポインタ (*a) と値 (**a) を書き換えることができない
int* const* b = x; // 一重ポインタ (*b) の指すアドレスを書き換えることができない
int** const c = x; // 二重ポインタ (c) の指すアドレスを書き換えることができない
**a = 1;
**b = 1;
**c = 1;
*a = nullptr;
*b = nullptr;
*c = nullptr;
a = nullptr;
b = nullptr;
c = nullptr;
return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:7:9: error: read-only variable is not assignable
**a = 1;
~~~ ^
sample.cpp:10:8: error: read-only variable is not assignable
*a = nullptr;
~~ ^
sample.cpp:11:8: error: read-only variable is not assignable
*b = nullptr;
~~ ^
sample.cpp:15:7: error: cannot assign to variable 'c' with const-qualified type 'int **const'
c = nullptr;
~ ^
sample.cpp:6:17: note: variable 'c' declared const here
int** const c = x;
~~~~~~~~~~~~^~~~~
4 errors generated.
よくある間違い
int main()
{
int** x = nullptr;
const int** a = x;
return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:4:17: error: cannot initialize a variable of type 'const int **' with an lvalue of type 'int **'
const int** a = x;
^ ~
1 error generated.
int**
を const int**
に変換することはできません。
おまけ(三重ポインタ)
int main()
{
int*** x = nullptr;
const int*** a = x; // const - none - none
int* const** b = x; // none - const - none
const int* const** c = x; // const - const - none
const int** const* d = x; // const - none - const
int* const* const* e = x; // none - const - const これは OK
return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:4:18: error: cannot initialize a variable of type 'const int ***' with an lvalue of type 'int ***'
const int*** a = x; // const - none - none
^ ~
sample.cpp:5:18: error: cannot initialize a variable of type 'int *const **' with an lvalue of type 'int ***'
int* const** b = x; // none - const - none
^ ~
sample.cpp:6:24: error: cannot initialize a variable of type 'const int *const **' with an lvalue of type 'int ***'
const int* const** c = x; // const - const - none
^ ~
sample.cpp:7:24: error: cannot initialize a variable of type 'const int **const *' with an lvalue of type 'int ***'
const int** const* d = x; // const - none - const
^ ~
4 errors generated.
const
を付け始めたら右端までキッチリ付けること。