Russian Qt Forum
Ноябрь 25, 2024, 06:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: const до/после *  (Прочитано 16430 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 05, 2019, 08:22 »

Добрый день

Код
C++ (Qt)
#include <QSet>
QSet<int *> theSet;
 
void Test( const int * ptr )
{
theSet.insert(ptr);
}
 
Не компилится, говорит что надо так
Код
C++ (Qt)
void Test( int * const ptr )
{
theSet.insert(ptr);
}
 
Ну ладно, хотя никакой возможности изменить помещенное нет.
Но почему так компилит
Код
C++ (Qt)
typedef int * TInt;
void Test( const TInt ptr )
{
theSet.insert(ptr);
}
 
Непонимающий Непонимающий (ту статью Алены читал)

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 05, 2019, 08:46 »

А вы разницу между этими записями понимаете?
Если вы проговорите словами, те типы которые вы написали, то все станет ясно.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #2 : Октябрь 06, 2019, 14:11 »

Не компилится, говорит что надо так
Код
C++ (Qt)
void Test( int * const ptr )
{
   theSet.insert(ptr);
}
 


квалификатор const не обязателен.
Код:
void Test(int* ptr)
{
    theSet.insert(ptr);
}

тебе нужно понять разницу между type* const и const* type
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 07, 2019, 08:03 »

Вопрос был о роли typedef в этом деле
Код
C++ (Qt)
// оказывается такая запись
typedef int * PInt;
const PInt a;
 
// равнозначна такой (константный указатель)
int * const a;
 
// а вовсе не такой (указатель на константу)
const int * a;
Чего это?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Октябрь 07, 2019, 08:16 »

Чего это?
А что вас собственно удивляет? Улыбающийся

Тайпдеф определяет указатель на не константные данные, а потом вы определяете константную переменную этого типа.
typedef != #define, как вы его себе представляете.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Октябрь 08, 2019, 14:11 »

Чего это?

Типы читаются справа налево. Поэтому const int c = 42 не совсем каноничная и понятная запись, более логично было бы int const c = 42 (и да, так можно!). Видимо, для удобства кожаных ублюдков (которые читают слева направо) было сделано исключение (ну а чо, удобно же).

PInt p; p - это указатель на (неконстантный) int.
const PInt p; p - это константный указатель на int (привет, исключение) . Аналогично PInt const
int * const p; тоже самое
const int * const p; p - это константный указатель на константный int (снова исключение)
int const * const p; p - тоже самое
« Последнее редактирование: Октябрь 08, 2019, 14:14 от Авварон » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #6 : Октябрь 08, 2019, 15:08 »

Видимо, для удобства кожаных ублюдков (которые читают слева направо) было сделано исключение (ну а чо, удобно же).

Интересно, что помешало изначально сделать написание типов с указателями/ссылками удобным для кожаных ублюдков? Улыбающийся

Чтобы было не:
const X * const p - means “p is a const pointer to an X that is const” (right-to-left),
а
const * const X p  - means "p is a const pointer to a const X" (left-to-right).

Кстати, некоторые кожаные и справа налево читают. А ещё некоторые вообще сверху вниз, справа налево Улыбающийся.
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Октябрь 08, 2019, 16:57 »


Интересно, что помешало изначально сделать написание типов с указателями/ссылками удобным для кожаных ублюдков? Улыбающийся

Возможно, вырвиглазной синтаксис функций принимающих указатели на функции берущих указатели на функции.
Впрочем, так и сделали в простом случае=)
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #8 : Октябрь 08, 2019, 17:28 »

Возможно, вырвиглазной синтаксис функций принимающих указатели на функции берущих указатели на функции.

Может быть. Похоже, истоки надо в языке С искать. Может тогдашним парсерам так было проще текст разгребать. Т.е. сначала кожаные прогнулись под тупые железяки, а потом начали разгибаться. Но так до конца и не выпрямились Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 09, 2019, 05:36 »

Типы читаются справа налево.
Пробовал представить как это, но чижело. Напр
Код:
const int * a;
Начинаем с int. Сначала к нему применяется const (получаем константный int), а затем звездочку, в итоге указатель на константный int - вроде верно. Т.е. сначала слева, потом справа, так что ли.

Все-таки интересно с typedef, выходит он играет роль скобок, но где это написано?  Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #10 : Октябрь 09, 2019, 09:39 »

Пробовал представить как это, но чижело. Напр
Код:
const int * a;
Начинаем с int. Сначала к нему применяется const (получаем константный int), а затем звездочку, в итоге указатель на константный int - вроде верно. Т.е. сначала слева, потом справа, так что ли.

What does “const X* p” mean?
Цитировать
Read it right-to-left: “p is a pointer to an X that is constant.”
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Октябрь 09, 2019, 16:18 »

What does “const X* p” mean?
Цитировать
Read it right-to-left: “p is a pointer to an X that is constant.”
Применим правило "справа налево" к др случаю
Код:
int * const a;
Начинаем с const (самый правый). И.. что? const "для чего"? Как это понимать? С др стороны если начать с базового int - все вполне стройно.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Октябрь 09, 2019, 16:54 »

constant pointer to int (константный указатель на инт)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #13 : Октябрь 09, 2019, 17:59 »

What does “const X* p” mean?
Цитировать
Read it right-to-left: “p is a pointer to an X that is constant.”
Применим правило "справа налево" к др случаю
Код:
int * const a;
Начинаем с const (самый правый). И.. что? const "для чего"? Как это понимать? С др стороны если начать с базового int - все вполне стройно.

По той же ссылке в следующем пункте:
Цитировать
X* const p means “p is a const pointer to an X that is non-const”: you can’t change the pointer p itself, but you can change the X object via p.
RTFM.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Октябрь 10, 2019, 11:26 »

constant pointer to int (константный указатель на инт)
Конкретно этот случай всем известен, просто запомнить его несложно. Интересны общие "правила чтения (навороченного) типа". Говорят "справа налево". Хорошо
Код:
int * const
Стало быть, const применяется ко всему что слева. Годится (здесь мы знаем "правельный ответ"). Ну а здесь
Код:
const int *
Слева никого нету. И шо Непонимающий
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.191 секунд. Запросов: 23.