Почему различное поведение для указателей "TYPE* const"?
Ниже код имеет дело с TYPE* const
указатель.
struct D {
void Check ()
{
D* const p = new D; // 2nd test is "p = 0;"
cout<<"p = "<<p<<endl;
(D*&)p = new D;
cout<<"p = "<<p<<endl; // prints 0, "p = 0;" at declaration
}
};
int main ()
{
D o;
o.Check();
}
Мои вопросы
- Если вы инициализируете с
0
, тогда даже если типизация в следующий раз не сработает. Является ли выполнение такого набора типов неопределенным поведением? this
указатель такжеTYPE* const
типа, то почему компилятор не позволяет ту же операцию дляthis
?
3 ответа
Как уже говорили другие, это неопределенное поведение, так как он пытается изменить
const
объект. Если вы инициализируете его нулем, то компилятор может рассматривать его как константу времени компиляции и игнорировать любые попытки изменить его. Или это может сделать что-то совершенно другое.this
не обычная переменная типаTYPE * const
; это типовое выражение типаTYPE *
, Это означает, что он вообще не может использоваться в качестве цели выражения присваивания или привязываться к непостоянной ссылке.
Является ли выполнение такого набора типов неопределенным поведением?
Да.
(D*&)p = new D;
Он вызывает неопределенное поведение, так как пытается изменить указатель const.
Напомним, что D* const p
объявляет переменную p
который является const
указатель на неконстантный D
,
D* const p = 0;
Эта декларация говорит, что p
это указатель на D
это постоянно, то есть никогда не изменится. Это всегда 0.
cout<<"p = "<<p<<endl;
Здесь вы отображаете значение p, которое вы ранее сказали, всегда будет 0. Угадайте, почему отображается 0!