foo(const T& var)
varが変更されないことがわかるように 宣言できます。
ポインタの同等の形式はfoo(const T* var)
?
過去に私はそれらを試しましたが、私に関連するiterator
/イライラするエラーがあり、私は恒常性を考慮せず const_iterator
に使用する傾向がありました。(T* var)
ポインタが指すコンテンツが変更されないように強制する関数を宣言するための優れたドキュメントはありますか?
あなたが持っているのは、ポインティの内容が変更されるのを禁止するポインタです。これは、「逆方向に読み取る」ルールを使用して確認できます。
const T* var <===== left to right from this read
逆読み:
var
T
定数であるへのポインタです
これはとは異なります
T* const var
読む:
var
への定数ポインタですT
ここでの違いは、定数が;var
ではなくT
;であるということです。つまりT
、間接参照によってを変更することはできますが、ポイントをvar
変更することはできません。var
そしてもちろん、上記の両方を同時に持つことができます:
const T* const var
(2つの簡単な変数初期化問題より)
に関する本当に良い経験則const
:
宣言は右から左に読んでください。
(Vandevorde/Josutiss の「C++ テンプレート: 完全ガイド」を参照)
例えば:
int const x; // x is a constant int
const int x; // x is an int which is const
// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p; // p is a reference to const-int
int * const * p; // p is a pointer to const-pointer to int.
この経験則に従って以来、そのような宣言を誤解することは二度とありません。
(: sisab retcarahc-rep a no ton,sisab nekot-rep a no tfel-ot-thgir naem I hguohT :tidE
同様に、関数シグネチャをこのルールに書き込むことができます。
void foo (int const * const p)
現在、p
const-int への const-pointer です。これは、関数の本体内では、p
他の何かを指すことができないことを意味します。つまり、ポインタを変更することも、ポインタが指すものを変更することもできません。
p が const-pointer であることは、実際には関数の本体にのみ関連する情報であり、ヘッダー ファイルからこの情報を省略する必要があります。
// foo.h
void foo (int const *p);
それから
// foo.cc
void foo (int const * const p) {
// Here, the const serves you as the implementor as an additional
// safety gear.
}