Почему различное поведение для указателей "TYPE * const"? - PullRequest
1 голос
/ 14 апреля 2011

Ниже код имеет дело с указателем 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 ]

5 голосов
/ 14 апреля 2011

Делает ли такое приведение типов неопределенное поведение?

Да.

(D*&)p = new D;

Вызывает неопределенное поведение при попытке изменить указатель const.

Напомним, что D* const p объявляет переменную p, которая является const указателем на неконстантный D.

2 голосов
/ 14 апреля 2011
D* const p = 0;

В этом объявлении говорится, что p - это указатель на D, который является постоянным, то есть никогда не изменится. Это всегда 0.

cout<<"p = "<<p<<endl;

Здесь вы отображаете значение p, которое вы ранее сказали, что всегда будет 0. Угадайте, почему отображается 0!

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

  2. this не обычная переменная типа TYPE * const;это rvalue-выражение типа TYPE *.Это означает, что он вообще не может использоваться как цель выражения присваивания или привязываться к непостоянной ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...