コードがあるとします
#include <iostream>
struct A{
int y;
int& x;
A():y(0),x(y){}
};
void f(int& x){
x++;
}
void g(const A& a){
f(a.x);
//f(a.y);
}
int main(){
A a;
g(a);
std::cout<<a.y<<std::endl;
}
g() 内で y に対して f() を呼び出すことは許可されません。これは、a が const 修飾子と共に渡されるためです。ただし、x に対して f を呼び出すことにより、g() 内で y の値を変更できます。
ポインターを使用すると、非常によく似たものが得られます
struct B{
int* x;
}
と
g(const B&){
*x++;
}
許可されています。これは完全に明らかです。非 const int への const ポインターがあります。しかし、前の参照の例では、参照がオブジェクトである場合、なぜこの場合はポインターとして動作するのでしょうか? この動作の下での設計ポリシーは何ですか?