Почему MSVC14 позволяет объявлять указатель на динамический неинициализированный объект const? - PullRequest
4 голосов
/ 25 октября 2019

В «C ++ Primer 5th edition» глава 12 «Динамическая память и интеллектуальные указатели» гласит:

Как и любой другой const, динамически размещенный объект const должен быть инициализирован. Константный динамический объект типа класса, который определяет конструктор по умолчанию (§ 7.1.4, с. 263), может быть инициализирован неявно. Объекты других типов должны быть явно инициализированы. Поскольку выделенный объект является const, указатель, возвращаемый new, является указателем на const (§ 2.4.2, стр. 62).

Таким образом, подобное утверждение считается ошибкой:

const int* pi = new const int;
  • Если я запускаю этот оператор в GCC, он не компилируется, но почему он компилируется в MSVC14?

  • Мне кажется, что это глупая ошибка, указатель - указатель на const, что означает, что нет возможности назначить его позже, также доступ к нему осуществляется UB.

1 Ответ

0 голосов
/ 25 октября 2019

Это не «ошибка» в MSVC, потому что это не работа компилятора, а время выполнения.

const int ci; // error ci is a constant object in Stack-memory so it must be initialized at compile-time.


const int* cpi; // ok. just a pointer to const. The compiler doesn't know whether you'll assign an initialized const object or not.

int choice = 0;
std::cin >> choice;
if(choice == arbitraryValue)
    cpi = new const int; // or cpi = new cont int(anotherArbitraryValue );
  • Как вы можете видеть, это разрешено, потому что при компиляциивремя, когда компилятор не знает, как объект будет создан и инициализирован во время выполнения.

  • Похоже, что вы спрашиваете:

    int a[]{1, 2, 3, 4};
    int index;
    cin >> index; // e.g: user enters 10
    cout << a[i];
    

Почему компилятор позволяет использовать индекс out range? Опять же, потому что компилятор не знает об этом значении времени выполнения;он проверяет только то, является ли тип индекса связанным типом, который можно использовать для доступа к индексу массива.

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