struct A {
int &r;
A (int &i) : r(i) {}
void foo () const {
r = 5; // <--- ok
}
};
コンパイラは でエラーを生成しませんr = 5;
。それはすでにconst-correct
が参照
であることを意味しますか(論理的には) ですか? [関連する質問が 1 つあります。]&r
int* const
struct A {
int &r;
A (int &i) : r(i) {}
void foo () const {
r = 5; // <--- ok
}
};
コンパイラは でエラーを生成しませんr = 5;
。それはすでにconst-correct
が参照
であることを意味しますか(論理的には) ですか? [関連する質問が 1 つあります。]&r
int* const
「すでにconst-correct」とはどういう意味か正確にはわかりませんが、
への代入r
は、 のコンストラクターに渡されたものへの代入と同じですA
。A
これを行うときのインスタンスでは何も変更していないため、 foo
const と宣言されているという事実は障害にはなりません。あなたがこれをしたかのようです:
struct A {
int * r;
A (int * i) : r(i) {}
void foo () const { *r = 5; }
}
const であるという事実は、呼び出されたインスタンスでfoo
何も変更しないことを意味します。A
それと、提供された他のデータを変更することとの間に矛盾はありません。
もちろん、たまたま がr
のメンバーへの参照になるように手配した場合A
、呼び出しfoo
によって のインスタンスが最終的に変更されますA
。const
コンパイラは、メンバー関数の性質が侵害される可能性のあるすべての方法をキャッチすることはできません。メンバー関数を宣言するときはconst
、そのような策略に関与しないことを約束しています。
私はメンバー関数を、そのような修飾子をまだ持っていないすべてのデータ メンバーのすぐ左にconst
暗黙的に挿入すると解釈します。const
これconst
は、参照のために暗黙的に既に存在します (int & const r;
は不正な構文です)。言い換えれば、参照は命名法を使用するために「すでにconst-correct」です。
const
メンバー関数の修飾子が、const
すべてのデータ メンバーのすべての可能な有効な位置に挿入する効果を持っていればいいのですが(たとえば、データ メンバーはメンバー関数のint ** foo;
ようint const * const * const foo;
に動作しconst
ます)、それは起こることではありません。標準が言うことは起こります。
はい、論理的には と同等ですint* const
。
この場合、値r
参照への不要な変更を防ぐために、適切に修飾されたアクセサーを作成して使用することをお勧めします。