"auto" vs "auto*" для указателя
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 19.03.18 19:17
Оценка:
Привет всем.

Есть функция, которая возвращает указатель — const int* func();

В чем различие между:

const auto* const p=func();

и
const auto p=func();

?

Я правильно понимаю, что в оба варианта (в данном конкретном случае) идентичны?

В первом мы не указываем тип указателя (возвращаемого func), а во втором мы не указываем тип результата func?

Лично мне больше нравится первый вариант — в нем мы явно обозначаем, что "p" это указатель.

Прокомментируйте, плиз
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 19.03.18 23:27
Оценка: 6 (1) +2
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Есть функция, которая возвращает указатель — 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();

в нем мы явно обозначаем вообще все

Ну а если серьезно, то что лучше, а что хуже, это ты уже решаешь сам, в зависимости от требуемой степени обобщенности (от чего нужно абстрагироваться, а что наоборот, нужно зафиксировать).
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 07:01
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>В чем различие между:


КД>
КД>const auto* const p=func();
КД>

КД>и
КД>
КД>const auto p=func();
КД>

КД>?

КД>Я правильно понимаю, что в оба варианта (в данном конкретном случае) идентичны?


В первом случае p будет не только указателем на данные, которые нельзя менять, но и значение самого указателя менять будет нельзя. В этом ключевое отличие между const int* и const int* const
Re[2]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 07:21
Оценка:
Здравствуйте, Maniacal, Вы писали:

КД>>
КД>>const auto* const p=func();
КД>>

КД>>и
КД>>
КД>>const auto p=func();
КД>>

КД>>?

M>В первом случае p будет не только указателем на данные, которые нельзя менять, но и значение самого указателя менять будет нельзя.


Во втором случае будет ровно то же самое: auto здесь соответствует const int*, а вот const, написанный явно, как раз к самому указателю и относится:

https://ideone.com/j9djd9

  const auto p = func();    
  p = nullptr; // error: assignment of read-only variable ‘p’
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 07:27
Оценка:
Здравствуйте, 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>


Хм, действительно. Но весьма нелогично.
Re[4]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 07:29
Оценка:
Здравствуйте, Maniacal, Вы писали:

R>>
R>>  const auto p = func();    
R>>  p = nullptr; // error: assignment of read-only variable ‘p’
R>>


M>Хм, действительно. Но весьма нелогично.


Полагаешь, было бы логичнее, если бы этот const относился не к p?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 07:34
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Maniacal, Вы писали:


R>>>
R>>>  const auto p = func();    
R>>>  p = nullptr; // error: assignment of read-only variable ‘p’
R>>>


M>>Хм, действительно. Но весьма нелогично.


R>Полагаешь, было бы логичнее, если бы этот const относился не к p?


Нелогично, что код
int a = 0;
const auto* b = &a;

идентичен
int a = 0;
const int* const b = &a;

а не
int a = 0;
const int* b = &a;

Логично, чтобы было различие между const auto* const и const auto*
Re[6]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 07:44
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, rg45, Вы писали:


R>>Здравствуйте, Maniacal, Вы писали:


R>>>>
R>>>>  const auto p = func();    
R>>>>  p = nullptr; // error: assignment of read-only variable ‘p’
R>>>>


M>>>Хм, действительно. Но весьма нелогично.


R>>Полагаешь, было бы логичнее, если бы этот const относился не к p?


M>Нелогично, что код

M>
M>int a = 0;
M>const auto* b = &a;
M>

M>идентичен
M>
M>int a = 0;
M>const int* const b = &a;
M>

M>а не
M>
M>int a = 0;
M>const int* b = &a;
M>

M>Логично, чтобы было различие между const auto* const и const auto*

И опять ты ошибаешься. Как раз здесь первый вариант идентичен третьему, а не второму:

https://ideone.com/LzMGc5

  int a = 0;
  const auto* b = &a;
 
  static_assert(std::is_same<decltype(b), const int*>::value, "unexpected type");
  b = nullptr; // Ok
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 08:07
Оценка:
Здравствуйте, rg45, Вы писали:
R>
R>  int a = 0;
R>  const auto* b = &a;
 
R>  static_assert(std::is_same<decltype(b), const int*>::value, "unexpected type");
R>  b = nullptr; // Ok
R>


Опечатался. Имелл в виду, что код

int a = 0;
const auto b = &a;

Идентичен
int a = 0;
const int* const b = &a;

а не
int a = 0;
const int* b = &a;
Re[2]: "auto" vs "auto*" для указателя
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 20.03.18 08:16
Оценка:
Здравствуйте, rg45, Вы писали:

КД>>Лично мне больше нравится первый вариант — в нем мы явно обозначаем, что "p" это указатель.


R>В таком случае, может быть, такой вариант тебе понравится еще больше:

const int* const p = func();

R>в нем мы явно обозначаем вообще все

Ага, но я не хочу указывать "int". У меня вместо него километровое имя типа.

Первый вариант, как показывает эксперимент, предсказуемо работает и для случая "int* func()".

const auto* const p=func();


компилятор формирует "p" как константный указатель на константу. Что мне и хочется получить.

---
Все таки auto немного мутноватая штука.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[8]: "auto" vs "auto*" для указателя
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 20.03.18 08:23
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Опечатался. Имелл в виду, что код


M>int a = 0;
M>const auto b = &a;

M>Идентичен
M>int a = 0;
M>const int* const b = &a;
M>

M>а не
M>int a = 0;
M>const int* b = &a;


Нет.

int a = 0;
const auto b = &a;

(*b)=1;
b=nullptr; //ERROR


b — это неизменяемый указатель (типа как ссылка). Но он указывает на неконстантное значение.

То есть это

int* const b=&a;
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[8]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 08:23
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Опечатался. Имелл в виду, что код


M>
M>int a = 0;
M>const auto b = &a;
M>

M>Идентичен
M>
M>int a = 0;
M>const int* const b = &a;
M>

M>а не
M>
M>int a = 0;
M>const int* b = &a;
M>


Хорошо, а если мы немного перепишем первый вариант:

int a = 0;
auto const b = &a;


каковы будут твои ожидания в этом случае?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[9]: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 08:27
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Нет.


КД>
КД>int a = 0;
КД>const auto b = &a;

КД>(*b)=1;
КД>b=nullptr; //ERROR
КД>


Да.
Я про это и говорю. При том, что &a не фига не const, auto откуда-то второй квалификатор const берёт.
Re[9]: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 08:29
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Maniacal, Вы писали:


R>Хорошо, а если мы немного перепишем первый вариант:


R>
R>int a = 0;
R>auto const b = &a;
R>


R>каковы будут твои ожидания в этом случае?


Вот тут, исходя из того, что &a это int* логично было бы, чтобы auto заменился на int*, т.е. на
int* const b = &a;
Re[3]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 08:31
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Все таки auto немного мутноватая штука.


Да один раз разобраться как следует, потом все эти конструкции будут читаться на автомате. Чтоб легче было разбираться, можно думать об auto как о неком алиасе типа (как typedef или using declaration).
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: "auto" vs "auto*" для указателя
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 20.03.18 08:38
Оценка:
Здравствуйте, Maniacal, Вы писали:

КД>>Нет.


КД>>
КД>>int a = 0;
КД>>const auto b = &a;

КД>>(*b)=1;
КД>>b=nullptr; //ERROR
КД>>


M>Да.

M>Я про это и говорю.

Разве?

M>Идентичен

M>int a = 0;
M>const int* const b = &a;


Сооруди тестовый проект и увидишь что это "int* const b = &a;".
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[10]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 08:40
Оценка:
Здравствуйте, 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 эквивалентны. Таковы требования стандарта язка.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[8]: "auto" vs "auto*" для указателя
От: rg45 СССР  
Дата: 20.03.18 08:44
Оценка: +1
Здравствуйте, Maniacal, Вы писали:

M>Опечатался. Имелл в виду, что код


M>
M>int a = 0;
M>const auto b = &a;
M>

M>Идентичен
M>
M>int a = 0;
M>const int* const b = &a;
M>


Все равно неправильно

int a = 0;
const auto b = &a;

идентичен
int a = 0;
auto const b = &a;

и разворачивается в
int a = 0;
int* const b = &a;
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[11]: "auto" vs "auto*" для указателя
От: Maniacal Россия  
Дата: 20.03.18 08:51
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Сооруди тестовый проект и увидишь что это "int* const b = &a;".


Ещё лучше. const auto для int* преобразуется не в const int*, а в int* const
Впрочем, та же фигня с typedef
typedef int* T;
int a = 0;
const T b = &a;

равно
int a = 0;
int* const b = &a;

Что отличается от
#define T int*
const T q = &a;
Отредактировано 20.03.2018 8:54 Maniacal . Предыдущая версия . Еще …
Отредактировано 20.03.2018 8:54 Maniacal . Предыдущая версия .
Re[12]: "auto" vs "auto*" для указателя
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 20.03.18 08:54
Оценка:
Здравствуйте, Maniacal, Вы писали:

КД>>Сооруди тестовый проект и увидишь что это "int* const b = &a;".


M>Ещё лучше. const auto для int* преобразуется не в const int*, а в int* const

M>Впрочем, та же фигня с typedef

И?

Работает не так как ожидается?

А не надо ожидать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.