Информация об изменениях

Сообщение Re[12]: так компайл тайм рефлекшину быть 26-й стандарт ?? от 25.03.2026 9:05

Изменено 25.03.2026 9:15 rg45

Re[12]: так компайл тайм рефлекшину быть 26-й стандарт ??
Здравствуйте, ботаныч, Вы писали:

R>>Во-вторых, здесь тоже будет создан "инстанс", т.к. указатель — это тоже объект (нулевой указатель в т.ч).

Б> разыменования здесь нет.

??? Где ты видишь в ЭТОМ моём высказывании слово "разыменовывание"?

Б>здесь приведение nullptr к типу, в котором реализован статический метод.


Приведение к УКАЗАТЕЛЮ. Здесь СОЗДАЁТСЯ временный объект указателя. Ещё раз указатель — это объект, имеющий размер и этот размер никак не меньше размера объекта пустой структуры. И статический метод реализован не в указателе, а в классе объектов, на которые указывают указатели данного типа.

R>>Выигрыш по сравнению с созданием объекта пустой структуры сомнителен. В-третьих, я вот думаю, а не будет ли здесь UB (разыменовывание нулевого указателя)? Вот это не очень очевидно для меня — с одной стороны, разыменовывание налицо, с другой — доступа к области памяти, занимаемой объектом нет, this не используется даже формально.

Б>собственно
Б>

Б>В выражении ((std::numeric_limits<double>*)nullptr)->epsilon() никакой объект не будет инстанцирован.

Смотри выше. Бутет СОЗАН объект указателя. И слово "инстанцирование" в С++ обозначает создание экземпляров шаблонов. но никак не объектов.

Б>Это происходит по следующим причинам:
Б>Статическая природа: Функция epsilon() определена как static constexpr. В языке C++ вызов статического метода через указатель — это лишь синтаксический способ указать компилятору на конкретный тип. Разыменования указателя в реальности не происходит.
Б>Работа компилятора: Для вызова этой функции компилятору достаточно знать тип (std::numeric_limits). Он подставляет значение константы прямо в место вызова еще на этапе компиляции.
Б>Отсутствие UB: Так как фактического обращения к памяти по адресу nullptr не случается, это выражение безопасно и не вызывает неопределенного поведения.

Б>для перехода в точку можно было бы написать (*(std::numeric_limits<double>*)nullptr).epsilon(), но тут уже UB, потому я написал самое близкое и корректное к std::numeric_limits<double>::epsilon().

Вот эти много букв на чём-то основаны? Или ты написал это просто потому, что тебе хочется в это верить? Ну так я тебя огорчу, стандарт C++ думает по-другому:

https://timsong-cpp.github.io/cppwp/expr.ref#2

The expression E1->E2 is converted to the equivalent form (*(E1)).E2; the remainder of [expr.ref] will address only the form using a dot.


Выражение E1->E2 ЭКВИВАЛЕНТНО выражению (*(E1)).E2 (если только операторы '->' и '*' не являются перегруженными функциями). И из этой эквивалентности следует, что не может быть такого, что в одном случае есть разыменовывание, а вдругом нет, то же самое относительно UB.

Б> Но самое забавное, что мы даже не это обсуждаем, мы обсуждаем совсем другую точку, которую предложил коллега B0FEE664.

Б>А именно точка времени компиляции со некими скрытыми итерабильными свойствами времени компиляции. А это немного другой оператор.

Так я и писал только про точки, это ты зачем-то приплёл сюда третий оператор.
Re[12]: так компайл тайм рефлекшину быть 26-й стандарт ??
Здравствуйте, ботаныч, Вы писали:

R>>Во-вторых, здесь тоже будет создан "инстанс", т.к. указатель — это тоже объект (нулевой указатель в т.ч).

Б> разыменования здесь нет.

??? Где ты видишь в ЭТОМ моём высказывании слово "разыменовывание"?

Б>здесь приведение nullptr к типу, в котором реализован статический метод.


Приведение к УКАЗАТЕЛЮ. Результатом этого приведения является временный объект указателя соответствующего типа. Ещё раз указатель — это объект, имеющий размер, и этот размер никак не меньше размера объекта пустой структуры. И статический метод реализован не в указателе, а в классе объектов, на которые указывают указатели данного типа.

R>>Выигрыш по сравнению с созданием объекта пустой структуры сомнителен. В-третьих, я вот думаю, а не будет ли здесь UB (разыменовывание нулевого указателя)? Вот это не очень очевидно для меня — с одной стороны, разыменовывание налицо, с другой — доступа к области памяти, занимаемой объектом нет, this не используется даже формально.

Б>собственно
Б>

Б>В выражении ((std::numeric_limits<double>*)nullptr)->epsilon() никакой объект не будет инстанцирован.

Смотри выше. Бутет СОЗАН объект указателя. И слово "инстанцирование" в С++ обозначает создание экземпляров шаблонов. но никак не объектов.

Б>Это происходит по следующим причинам:
Б>Статическая природа: Функция epsilon() определена как static constexpr. В языке C++ вызов статического метода через указатель — это лишь синтаксический способ указать компилятору на конкретный тип. Разыменования указателя в реальности не происходит.
Б>Работа компилятора: Для вызова этой функции компилятору достаточно знать тип (std::numeric_limits). Он подставляет значение константы прямо в место вызова еще на этапе компиляции.
Б>Отсутствие UB: Так как фактического обращения к памяти по адресу nullptr не случается, это выражение безопасно и не вызывает неопределенного поведения.

Б>для перехода в точку можно было бы написать (*(std::numeric_limits<double>*)nullptr).epsilon(), но тут уже UB, потому я написал самое близкое и корректное к std::numeric_limits<double>::epsilon().

Вот эти много букв на чём-то основаны? Или ты написал это просто потому, что тебе хочется в это верить? Ну так я тебя огорчу, стандарт C++ думает по-другому:

https://timsong-cpp.github.io/cppwp/expr.ref#2

The expression E1->E2 is converted to the equivalent form (*(E1)).E2; the remainder of [expr.ref] will address only the form using a dot.


Выражение E1->E2 ЭКВИВАЛЕНТНО выражению (*(E1)).E2 (если только операторы '->' и '*' не являются перегруженными функциями). И из этой эквивалентности следует, что не может быть такого, что в одном случае есть разыменовывание, а вдругом нет, то же самое относительно UB.

Б> Но самое забавное, что мы даже не это обсуждаем, мы обсуждаем совсем другую точку, которую предложил коллега B0FEE664.

Б>А именно точка времени компиляции со некими скрытыми итерабильными свойствами времени компиляции. А это немного другой оператор.

Так я и писал только про точки, это ты зачем-то приплёл сюда третий оператор.