Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Есть функция, которая возвращает указатель — const int* func();
КД>
КД>const auto* const p=func();
КД>
КД>и КД>
КД>const auto p=func();
КД>
КД>?
КД>Я правильно понимаю, что в оба варианта (в данном конкретном случае) идентичны?
Это правильно. Можно предложить еще один равноценный вариант с использованием auto:
auto* const p = func();
в этом случае auto будет соответствовать const int.
КД>Лично мне больше нравится первый вариант — в нем мы явно обозначаем, что "p" это указатель.
В таком случае, может быть, такой вариант тебе понравится еще больше:
const int* const p = func();
в нем мы явно обозначаем вообще все
Ну а если серьезно, то что лучше, а что хуже, это ты уже решаешь сам, в зависимости от требуемой степени обобщенности (от чего нужно абстрагироваться, а что наоборот, нужно зафиксировать).
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>В чем различие между:
КД>
КД>const auto* const p=func();
КД>
КД>и КД>
КД>const auto p=func();
КД>
КД>?
КД>Я правильно понимаю, что в оба варианта (в данном конкретном случае) идентичны?
В первом случае p будет не только указателем на данные, которые нельзя менять, но и значение самого указателя менять будет нельзя. В этом ключевое отличие между const int* и const int* const
Здравствуйте, rg45, Вы писали:
R>Во втором случае будет ровно то же самое: auto здесь соответствует const int*, а вот const, написанный явно, как раз к самому указателю и относится:
R>https://ideone.com/j9djd9
R>
R> const auto p = func();
R> p = nullptr; // error: assignment of read-only variable ‘p’
R>
Здравствуйте, rg45, Вы писали:
КД>>Лично мне больше нравится первый вариант — в нем мы явно обозначаем, что "p" это указатель.
R>В таком случае, может быть, такой вариант тебе понравится еще больше:
const int* const p = func();
R>в нем мы явно обозначаем вообще все
Ага, но я не хочу указывать "int". У меня вместо него километровое имя типа.
Первый вариант, как показывает эксперимент, предсказуемо работает и для случая "int* func()".
const auto* const p=func();
компилятор формирует "p" как константный указатель на константу. Что мне и хочется получить.
---
Все таки auto немного мутноватая штука.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Все таки auto немного мутноватая штука.
Да один раз разобраться как следует, потом все эти конструкции будут читаться на автомате. Чтоб легче было разбираться, можно думать об auto как о неком алиасе типа (как typedef или using declaration).
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Maniacal, Вы писали:
R>>Хорошо, а если мы немного перепишем первый вариант:
R>>
R>>int a = 0;
R>>auto const b = &a;
R>>
R>>каковы будут твои ожидания в этом случае?
M>Вот тут, исходя из того, что &a это int* логично было бы, чтобы auto заменился на int*, т.е. на M>
M>int* const b = &a;
M>
Так и имиенно это и происходит Остается совсем чуть-чуть — понять, что объявления auto const b и const auto b эквивалентны. Таковы требования стандарта язка.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Maniacal, Вы писали:
КД>>Сооруди тестовый проект и увидишь что это "int* const b = &a;".
M>Ещё лучше. const auto для int* преобразуется не в const int*, а в int* const M>Впрочем, та же фигня с typedef
И?
Работает не так как ожидается?
А не надо ожидать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --