class Test
{
public:
Test() : i(0), ptr(&i) {}
int i;
int *ptr;
void change_const (int x) const { *ptr=x; }
};
int main()
{
const Test obj;
obj.ptr = &obj.i; // error
obj.change_const(99);
return 0;
}
Хотя в obj
ptr
имеет типа int *const
, конструктор может заставить его указать на i
типа const int
. Явная попытка сделать это, конечно, терпит неудачу. Почему конструктор предлагает эту уязвимость относительно корректности const? Другие неявно очевидные уязвимости, такие каксопз корректность с константными объектами и указателями членов, конструктор уязвимость
int *ptr;
const int **c_ptr = &ptr; // error
const int c = 10;
*c_ptr = &c;
*ptr = 20; // because here change of c possible
также хорошо известны.
C++ иногда дает вам достаточно веревки, чтобы повесить себя. Просто не пишите код собачки в первую очередь и играйте по правилам –