Недавно я изучал С++, и только сегодня мы познакомились с константой const и понятием const. Чтобы лучше понять теорию, я пишу серию простых программ, чтобы убедиться, что я правильно понимаю концепцию. Я думал, что все понял, но потом, используя ключевое слово auto в одной из программ, я, кажется, немного застрял.
Чтобы проверить, что я понял, как работают константные указатели, я написал простую программу. Я не буду беспокоиться о публикации всего этого, потому что есть только две его части. У меня есть класс с членом данных const типа int:
const int tryToChangeMe;
Внутри этого класса у меня также есть функция-член, которая возвращает указатель const на указанную выше константу int:
const int* const MyClass::test()
{
return &tryToChangeMe;
}
В моей основной функции я вызываю вышеупомянутую функцию, используя ключевое слово auto. Чтобы проверить, что то, что я думаю, что знаю о const, правильно, я затем пытаюсь переназначить переменную tryToChangeMe через указатель. Например:
auto temp = myClass.test();
*temp = 100;
Как я и ожидал, программа не будет компилироваться из-за ошибки, возникшей при попытке присвоить значение константной переменной. Тем не менее, я не просто вернул указатель на const, я вернул указатель на const (по крайней мере, то, что, как я думал, я сделал). Поэтому, чтобы проверить это, я попытался переназначить указатель на новый адрес памяти, вполне уверен, что я получаю аналогичную ошибку компиляции:
temp = new int;
Но довольно запутанно программа скомпилирована без каких-либо проблем. Пройдя через отладчик, он обнаружил, что достаточно уверен, указатель терял свой первоначальный адрес и был назначен совершенно новым. Удивляясь, что происходит, я просто случайно удалил ключевое слово auto и заменил его переменной полного типа:
const int* const temp = myClass.test();
После повторного тестирования все результаты были такими же ожидаемыми, и на этот раз я не смог переназначить указатель на новый адрес.
Итак, после всего этого, я думаю, мой вопрос: почему? Почему ключевое слово auto позволяет вам обойти квалификатор const указателей? Я сделал что-то не так?
Кстати, я не уверен, имеет ли это значение, но я использую предварительный просмотр Visual Studio 2015