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