Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Указатель this, теория

23.03.2017, 12:53. Показов 6655. Ответов 80
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
9.3.2 The this pointer [class.this]
The type of this in a member function of a class X is X*.
Последнее предложение приведённой цитаты чётко ничего не говорит о константности this.

И все говорят о его константности...
указатель this всегда является указателем const и не может быть переназначен
Помогите вникнуть. Я чего-то недопонял. Не, ну я принимал второе, а тут прочёл, и.. не врубился.
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2017, 12:53
Ответы с готовыми решениями:

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct обобщение{ключ; void* на что угодно}...

Функция, принимающая указатель и число байт и выделяющая память под указатель
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

80
23.03.2017, 16:50
Студворк — интернет-сервис помощи студентам

Не по теме:

Однако, был не прав. Спасибо hoggy и + в карму.

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
23.03.2017, 18:21
Цитата Сообщение от daslex Посмотреть сообщение
Я чего-то недопонял. Не, ну я принимал второе, а тут прочёл, и.. не врубился.
Когда речь идет о скалярных типах (арифметические типы, указатели и т.п.) prvalue значения этих типов никогда не бывают "констатными" (никогда не имеют cv-квалификации). Например, выражение 2 + 3 дает prvalue типа int. Не const int, а именно int. Выражение 3.14 имеет тип double. Не const double, а именно double.

То же самое относится и к указателю this. Так как указатель this имеет скалярный тип и, как уже было сказано, является prvalue, он в принципе не может быть const.

Поэтому утверждения типа "указатель this всегда является указателем const и не может быть переназначен" являются терминологически некорректными. Понятно, что хотел сказать автор, но выразился он неправильно. Указатель this не может быть переназначен именно потому, что он является prvalue, а не потому, что он якобы является const.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 18:22  [ТС]
Да может this согласно стандарту быть const! Просто он не всегда const. Общее заблуждение, что он именно всегда const, в студии, например, вопреки общему стандарту, он действительно всегда const.

Хватит всех путать.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
23.03.2017, 18:23
Цитата Сообщение от daslex Посмотреть сообщение
Да может this согласно стандарту быть const! Просто он не всегда const. Общее заблуждение, что он именно всегда const, в студии, например, вопреки общему стандарту, он действительно всегда const.
Не надо бредить. Тип скалярного prvalue никогда в С++ не содержит квалификатора const.

Формулировка этого правила менялась с ходом времени, но общая идея остается неизменной

3.10 Lvalues and rvalues
4 Unless otherwise indicated (5.2.2), prvalues shall always have complete types or the void type; in addition to these types, glvalues can also have incomplete types. [ Note: class and array prvalues can have cv-qualified types; other prvalues always have cv-unqualified types. See Clause 5. —end note ]

5 Expressions
6 If a prvalue initially has the type “cv T,” where T is a cv-unqualified non-class, non-array type, the type of the expression is adjusted to T prior to any further analysis.
0
23.03.2017, 18:26

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
Да может this согласно стандарту быть const! Просто он не всегда const.
Цитата Сообщение от daslex Посмотреть сообщение
Хватит всех путать.
Какая вопиющая беспрадонность. А ведь достаточно всего лишь первое предложение в стандарте про this почитать...

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 18:30  [ТС]
Хватит всех путать.
Хоть бы один человек стандарт открыл. Хогги решился, и неожиданно со мной согласился. Разница только в том, что у меня нет хотя бы малость сильных знаний, чтобы описать примерами подобные тонкости.


If the member function is declared const, the type of this is const X*
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.03.2017, 18:33
daslex, как бы есть разница между const X* и X* const

Добавлено через 1 минуту
Ну хоть в чём то я был прав - вы и вправду путаете константный указатель и указатель на константу.
2
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
23.03.2017, 18:36
Цитата Сообщение от daslex Посмотреть сообщение
If the member function is declared const, the type of this is const X*
Ым... Тема этого обсуждения: имеет ли сам указатель this тип X *const или просто X *.

Ваше const X * - это совершенно другая опера к теме обсуждения никакого отношения не имеющая. Вам надо подучить разницу между const X * и X *const. Вы похоже не понимаете разницы между константностью самого указателя и константностью указуемого объекта.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 18:37  [ТС]
Уловил.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.03.2017, 18:46
Тема всё равно годная, ни в какое сравнение с кучей глупых вопросов в разделе.
3
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 18:53  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Поэтому утверждения типа "указатель this всегда является указателем const и не может быть переназначен" являются терминологически некорректными.
Ну, я это с https://msdn.microsoft.com/ru-... ddwwd.aspx выдрал. Дальше там, правда, идёт про то, что всё липнет к самому объекту, а не к this, но такая вот мелочь, способная ввести в заблуждение, имеет место.

Не по теме:

Я понял с указателями. Невнимательность, чтоб её.

0
23.03.2017, 19:01

Не по теме:

prvalue
Изначально так и хотел написать, но что-то меня смутило. :scratch:
А тема, действительно, интересная получилась.

0
23.03.2017, 20:51

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Тема всё равно годная, ни в какое сравнение с кучей глупых вопросов в разделе.
Темы с обсуждениями не задач - приятная редкость. :)

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 21:01  [ТС]
Побочный вопрос.
Является ли утверждение
В С++ всегда присутствовала концепция константных выражений. Так, выражения типа 3+4 всегда возвращали одни и те же результаты, не вызывая никаких побочных эффектов. Сами по себе константные выражения предоставляют компиляторам C++ удобные возможности по оптимизации результата компиляции. Компиляторы вычисляют результаты таких выражений только на этапе компиляции и сохраняют уже вычисленные результаты в программе. Таким образом, подобные выражения вычисляются только раз. Также существует несколько случаев, в которых стандарт языка требует использования константных выражений. Такими случаями, например, могут быть определения внешних массивов или значения перечислений (enum).
Ист.
Заблуждением того же рода?

Ведь 3+4 должно быть prvalue, но не const expression.

(Речь только о константности)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
23.03.2017, 21:27
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
Заблуждением того же рода?
Это в первую очередь терминологическое заблуждение.

В С++ есть два совершенно разных понятия: константность выражения и cv-квалификация (const-volatile квалификация) типа выражения.

* Под константностью значения выражения в С++ понимается известность его значения на стадии компиляции. (Это концептуальная известность. Значения адресных констант могут быть не известны на стадии компиляции, но тем не менее язык считает их константами.)

* Под cv-квалификацией значения выражения подразумевается наличие в типе результата выражения квалификаторов const или volatile верхнего уровня.

Это сильно разные вещи.

* Например, если мы объявили const int i = rand();, то выражение i является lvalue, имеет тип const int, то есть у него есть cv-квалификация. Однако константой (константным выражением) выражение i не является.

* В то же время если мы объявим const int i = 5;, то выражение i + 1 не является lvalue, имеет тип int (то не является cv-квалифицированным), но при этом оно является константой (константным выражением).

К сожалению, в неформальном или полуформальном контексте эти понятия часто перепутываются. Подразумевается, что из контекста должно быть понятно, о чем именно идет речь.

В данном случае дискуссия неформально шла о "константности" указателя this. Это, конечно же, неправильно. На самом деле мы говорили о const-квалифицированности значения this. Оно не является const-квалифицированным, т.к. является prvalue скалярного типа.

А вот является ли this константой (константным выражением) - это отдельная тема. Если я ничего не упускаю, в constexpr членах статических объектов this является адресным константным выражением. В остальных случаях - не является.

Процитированный вами текст тоже ведет речь именно о константных выражениях языка. Никакого заблуждения в процитированном тексте нет. Надо просто помнить, что к квалификатору const процитированный текст отношения не имеет. Под константностью выражения 3+4 понимается именно его константность, т.е. известность его значения не стадии компиляции. Но авторы не пытаются утверждать, что тип выражения 3+4 содержит квалификатор const.
9
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.03.2017, 21:33
Цитата Сообщение от daslex Посмотреть сообщение
Заблуждением того же рода?
нет.
здесь имеются ввиду константы времени компиляции.

результат 3+4 есть - временный объект, который 7.
но при этом само выражение - является константой времени компиляции.
и компилятор может тупо подставить 7 там,
где это выражение использовалось.

а сам результат таких вычислений можно использовать везде,
где требуются константы времени компиляции:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    // комментарии излишни
    constexpr int val1 = 3+4;
    
    //значение енума должно быть вычислимым времени компиляции
    enum { val2 = 3+4 };
    
    //количество элементов должно быть константой времени компиляции
    int ar[3+4]; 
}
однако не все константы - обязательно времени компиляции.

например:
C++
1
2
3
4
5
const int a = random(1,9);
const int b = random(1,9);
 
a+b; // результат - prvalue, 
// который не является константой времени компиляции
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 21:34  [ТС]

Не по теме:

Ненавижу контекст, он всё затрудняет.


Объяснение хорошее.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.03.2017, 21:39
Цитата Сообщение от hoggy Посмотреть сообщение
однако не все константы - обязательно времени компиляции.
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
3
4
5
const int a = random(1,9);
const int b = random(1,9);
 
a+b; // // результат - prvalue, 
// который не является константой времени компиляции
Зависит от устройства random.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.03.2017, 22:02  [ТС]
А вот объяснение Хогги меня корёжит (в переносном смысле).

3+4 - временный объект, он не prvalue?
Это адресный вопрос, только к Хогги.

Добавлено через 19 минут
На самом деле жаль, конечно, что разного вида константность смешали в одну кашу. Можно ведь приставками или префиксами было обозначать
какие-нибудь:
PHP
1
2
 pre-constant (предварительная константа) -> преконстанты
 cv-constant (const-volatilie константа) -> сивиконстанты
Что-то такого придумать не сложно. А так - догадайся, мол, угадай. Если человек самоучка, то беда же.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.03.2017, 22:11
Цитата Сообщение от daslex Посмотреть сообщение
3+4 - временный объект, он не prvalue?
prvalue и есть временные объекты.

Цитата Сообщение от daslex Посмотреть сообщение
А так - догадайся, мол, угадай
что там гадать то?
если значение может быть вычисленно
только времени выполнения,
значит уже не константа времени компиляции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2017, 22:11

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){}; cоздаю на нее указатель. int...

Как правильно удалять выделенную память под указатель на указатель?
есть код #include <iostream> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; void sort_1(const...

Зачем нужен указатель на указатель при работе с однонаправленным списком?
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно непонятен алгоритм инициализации такого вот списка. Например:...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Задача: Программно добавить префикс в нумерацию документов в самописной конфигурации на БСП (помощь начинающему коллеге). Решение: В модуле объекта документа размещен следующий код: Процедура. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru