Почему различное поведение для указателей "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();
}

Мои вопросы

  1. Если вы инициализируете с 0, тогда даже если типизация в следующий раз не сработает. Является ли выполнение такого набора типов неопределенным поведением?
  2. this указатель также TYPE* const типа, то почему компилятор не позволяет ту же операцию для this?

3 ответа

Решение
  1. Как уже говорили другие, это неопределенное поведение, так как он пытается изменить const объект. Если вы инициализируете его нулем, то компилятор может рассматривать его как константу времени компиляции и игнорировать любые попытки изменить его. Или это может сделать что-то совершенно другое.

  2. 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!

Другие вопросы по тегам