Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
98 / 71 / 13
Регистрация: 15.12.2013
Сообщений: 453
1

Спецификатор типа auto

28.08.2015, 22:02. Показов 1141. Ответов 5
Метки нет (Все метки)

C++
1
2
3
4
5
int num1 = 0;
auto ptr1 = &num1;          // 1. ok: ptr1 is (int *) auto calculates the (int *)
auto *ptr2 = &num1;         // 2. ok: ptr2 is (int *)??? auto calculates the (int *), why is the result type is not a (int **)?
const auto ptr3 = &num1;    // 3. ok: auto calculates (int *) plus const high level = int * const
const auto *ptr4 = &num1;   // 4. ok: auto calculates (int *)??? plus const low level = int const *
Собственно в самих комментариях вопрос.
Интересен 2 и 4 случай.
Какой тип выводится в 2 и 4 случае? Само выражение взятия адреса возвращает тип (int *), но почему результирующий тип все равно int *? Ведь мы добавляем еще *? В чем тогда отличие 2 от 1 случая?

Полагаю, что работает это так(могу ошибаться):

Для спецификатора типа auto есть возможность задать дополнительные спецификаторы типа, const, & и *.
Они нужны, в случае, когда нужен составной тип на основе выводимого, но если указанные дополнительные спецификаторы имеются в выводимом типе, то они игнорируются и таким образом мы как-бы конфигурируем результирующий тип?

Например:
C++
1
2
3
const int t = 0;
auto *lnk1 = &t;
const auto lnk2 = &t;
Тут получается так:
Для lnk1, смотрим, результат выражения const int *. Окей, смотрим на спецификаторы типа и видим auto *.
Поскольку * есть и в выводимом типе и в результирующем, убираем ее из выводимого типа и получаем: const int.
Заменяем auto на const int, получаем const int *lnk1 = &t;

Для lnk2, смотрим, результат выражения const int *. Окей, смотрим на спецификаторы типа и видим const auto.
В данном случае const у нас верхнего уровня, а в выводимом типе const int * нижнего.
Поэтому ничего удалять из выводимого типа не будем, а просто стыкуем.
Получаем const int * const lnk2 = &t;

Правильно ли мыслю? Или я где-то заблуждаюсь, а понимать поведение хочется.
1

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2015, 22:02
Ответы с готовыми решениями:

Ссылка и спецификатор auto
Здравствуйте. Простой вопрос, если не сложно. const int ci=i, &cr=ci; auto b=ci; auto c=cr;...

Какую пользу/вред может принести спецификатор auto?
Все больше я начинаю встречать в кодах auto, особенно с появлением последних версий Visual...

Какие типы скрывает спецификатор auto в заданном коде?
Всем привет. Подскажите, пожалуйста, какие типы скрывает спецификатор auto в данном коде: int...

Декларатор (спецификатор типа)
Вопрос невероятно глупый, но помогите разобраться - что задаёт этот декларатор: short int*...

5
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,204
28.08.2015, 22:08 2
Цитата Сообщение от ASCII Посмотреть сообщение
но почему результирующий тип все равно int *? Ведь мы добавляем еще *?
потому что такие правила игры.

Добавлено через 54 секунды
Цитата Сообщение от ASCII Посмотреть сообщение
auto *ptr2 = &num1;

нужно понимать так:

компилятор, выведи мне тип указателя на основе результата правостоящего выражения.

Добавлено через 2 минуты
Цитата Сообщение от ASCII Посмотреть сообщение
auto *ptr2 = &num1;
и в этом концептуальное отличие от delctype:


C++
1
delctype(&num1)* ptr2 = &num1; // будет ошибка компиляции
переменная ptr2 имеет тип результата выражения &num1, плюс звездочка.
0
98 / 71 / 13
Регистрация: 15.12.2013
Сообщений: 453
28.08.2015, 22:11  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
компилятор, выведи мне тип указателя на основе результата правостоящего выражения.
Это само собой, интересует меня в данном случае то, что выражение имеет тип int *, при этом мы добавляем еще *, а получаем в результате не int **, а int *.

Добавлено через 1 минуту
hoggy, могли бы Вы обратить внимание на мой второй пример и попытку объяснения? Правилен ли ход мыслей?
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,204
28.08.2015, 22:13 4
Цитата Сообщение от ASCII Посмотреть сообщение
Это само собой, интересует меня в данном случае то, что выражение имеет тип int *, при этом мы добавляем еще *, а получаем в результате не int **, а int *.
пилять, ещё раз:

C++
1
auto* p = expression;
выведи мне сцука тип указателя.

не указателя на указатель, а сцука просто указатель.
если не выведеццо - будет ошибка компиляции.

программист хочет обычный сцука указатель.

что не понятно?

Добавлено через 1 минуту
Цитата Сообщение от ASCII Посмотреть сообщение
auto *lnk1 = &t;
хотим указатель.

Цитата Сообщение от ASCII Посмотреть сообщение
const auto lnk2 = &t;
хотим любую фигню, но константную
(фигня должна суметь привестись к такого же типа, но константной)
1
98 / 71 / 13
Регистрация: 15.12.2013
Сообщений: 453
28.08.2015, 22:14  [ТС] 5
Цитата Сообщение от hoggy Посмотреть сообщение
выведи мне сцука тип указателя.
не указателя на указатель, а сцука просто указатель.
если не выведеццо - будет ошибка компиляции.
программист хочет обычный скуца указатель.
что не понятно?
Ну вот как раз если так мыслить, то по скольку мы просим вывести указатель на выражение, должно получиться указатель на int *(поскольку это выведенный тип) и это немного путает.
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,204
28.08.2015, 22:24 6
Цитата Сообщение от ASCII Посмотреть сообщение
Ну вот как раз если так мыслить, то по скольку мы просим вывести указатель на выражение
то мы и получаем указатель.

и это все, что нас интересует в данном случае.

Добавлено через 4 минуты
Цитата Сообщение от ASCII Посмотреть сообщение
и это немного путает.
для того, что бы читать код, совсем не обязательно ( и даже вредно)
знать всю его поднаготную.

например:


C++
1
2
for(const auto& i: container)
    std::cout<< i<<std::endl;
нужно понимать так:
глубоко наплевать какой фактический тип имеет container,
это просто гребанный контейнер.

и глубоко наплевать, какой тип элементов он содержит.
это просто грёбаннае элементы.

мы тупо перебираем весь контейнер и тупо выводим,
что бы там ни было - в консоль.

это все, что нужно знать для понимания такого кода.

"мы просто хотим показать содержимое контейнера.
и не важно, что это за контейнер.
и не важно, что он содержит.
главное - оно должно уметь выводиццо в консоль".

поймите это, и жить сразу станет проще.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2015, 22:24

Требуется спецификатор типа
Здравствуйте! Есть класс Bar. В другом классе создаю несколько переменных типа Bar. Выражение в...

Спецификатор типа для конструктора
Компилятор: error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не...

Ошибка 4430: Отсутствует спецификатор типа
Объявлен вот такой класс, к строчке выделенной синим компилятор предъявляет претензии: ...

Отсутствует спецификатор типа - предполагается int
Здравствуйте форумчане!Вот не понимаю возникновение одной ошибки : При объявлении указатель типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.