Это потому, что const
правила применяются во время компиляции, но это обход является результатом состояния времени выполнения. Создание неконстантной копии члена объекта, на который ссылается const, не изменяет объект и, следовательно, не нарушает ссылку на const. Это потому, что, насколько известно компилятору, все, что вы сделали, - это сделали копию значения, адрес части памяти. Он не предсказывает, что вы можете разыменовать его здесь или в другом месте - он не применяет константность к ячейкам памяти, но относится к идентификаторам, и вы еще не нарушили это.
Во время выполнения вы назначаете неконстантному ptr-адресу, на который также ссылается идентификатор const, но между ними нет соединения во время компиляции, поскольку константность применяется только к одному из способов доступа к нему. и даже тогда, только в рамках этой одной функции. Он не может обрабатывать ваш неконстантный указатель как const в некоторых случаях и неконстантный в других на основе состояния времени выполнения, что может нарушить семантику C ++ другими способами.