Сообщение Re[12]: так компайл тайм рефлекшину быть 26-й стандарт ?? от 25.03.2026 9:05
Изменено 25.03.2026 9:16 rg45
R>>Во-вторых, здесь тоже будет создан "инстанс", т.к. указатель — это тоже объект (нулевой указатель в т.ч).
Б> разыменования здесь нет.
??? Где ты видишь в ЭТОМ моём высказывании слово "разыменовывание"?
Б>здесь приведение nullptr к типу, в котором реализован статический метод.
Приведение к УКАЗАТЕЛЮ. Результатом этого приведения является временный объект указателя соответствующего типа. Ещё раз указатель — это объект, имеющий размер, и этот размер никак не меньше размера объекта пустой структуры. И статический метод реализован не в указателе, а в классе объектов, на которые указывают указатели данного типа.
R>>Выигрыш по сравнению с созданием объекта пустой структуры сомнителен. В-третьих, я вот думаю, а не будет ли здесь UB (разыменовывание нулевого указателя)? Вот это не очень очевидно для меня — с одной стороны, разыменовывание налицо, с другой — доступа к области памяти, занимаемой объектом нет, this не используется даже формально.
Б>собственно
Б>
Б>для перехода в точку можно было бы написать (*(std::numeric_limits<double>*)nullptr).epsilon(), но тут уже UB, потому я написал самое близкое и корректное к std::numeric_limits<double>::epsilon().Б>В выражении ((std::numeric_limits<double>*)nullptr)->epsilon() никакой объект не будет инстанцирован.
Смотри выше. Бутет СОЗАН объект указателя. И слово "инстанцирование" в С++ обозначает создание экземпляров шаблонов. но никак не объектов.
Б>Это происходит по следующим причинам:
Б>Статическая природа: Функция epsilon() определена как static constexpr. В языке C++ вызов статического метода через указатель — это лишь синтаксический способ указать компилятору на конкретный тип. Разыменования указателя в реальности не происходит.
Б>Работа компилятора: Для вызова этой функции компилятору достаточно знать тип (std::numeric_limits). Он подставляет значение константы прямо в место вызова еще на этапе компиляции.
Б>Отсутствие UB: Так как фактического обращения к памяти по адресу nullptr не случается, это выражение безопасно и не вызывает неопределенного поведения.
Вот эти много букв на чём-то основаны? Или ты написал это просто потому, что тебе хочется в это верить? Ну так я тебя огорчу, стандарт 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.
Б>А именно точка времени компиляции со некими скрытыми итерабильными свойствами времени компиляции. А это немного другой оператор.
Так я и писал только про точки, это ты зачем-то приплёл сюда третий оператор.
R>>Во-вторых, здесь тоже будет создан "инстанс", т.к. указатель — это тоже объект (нулевой указатель в т.ч).
Б> разыменования здесь нет.
??? Где ты видишь в ЭТОМ моём высказывании слово "разыменовывание"? Здесь же про другое.
Б>здесь приведение nullptr к типу, в котором реализован статический метод.
Приведение к УКАЗАТЕЛЮ. Результатом этого приведения является временный объект указателя соответствующего типа. Ещё раз указатель — это объект, имеющий размер, и этот размер никак не меньше размера объекта пустой структуры. И статический метод реализован не в указателе, а в классе объектов, на которые указывают указатели данного типа.
R>>Выигрыш по сравнению с созданием объекта пустой структуры сомнителен. В-третьих, я вот думаю, а не будет ли здесь UB (разыменовывание нулевого указателя)? Вот это не очень очевидно для меня — с одной стороны, разыменовывание налицо, с другой — доступа к области памяти, занимаемой объектом нет, this не используется даже формально.
Б>собственно
Б>
Б>для перехода в точку можно было бы написать (*(std::numeric_limits<double>*)nullptr).epsilon(), но тут уже UB, потому я написал самое близкое и корректное к std::numeric_limits<double>::epsilon().Б>В выражении ((std::numeric_limits<double>*)nullptr)->epsilon() никакой объект не будет инстанцирован.
Смотри выше. Бутет СОЗАН объект указателя. И слово "инстанцирование" в С++ обозначает создание экземпляров шаблонов. но никак не объектов.
Б>Это происходит по следующим причинам:
Б>Статическая природа: Функция epsilon() определена как static constexpr. В языке C++ вызов статического метода через указатель — это лишь синтаксический способ указать компилятору на конкретный тип. Разыменования указателя в реальности не происходит.
Б>Работа компилятора: Для вызова этой функции компилятору достаточно знать тип (std::numeric_limits). Он подставляет значение константы прямо в место вызова еще на этапе компиляции.
Б>Отсутствие UB: Так как фактического обращения к памяти по адресу nullptr не случается, это выражение безопасно и не вызывает неопределенного поведения.
Вот эти много букв на чём-то основаны? Или ты написал это просто потому, что тебе хочется в это верить? Ну так я тебя огорчу, стандарт 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.
Б>А именно точка времени компиляции со некими скрытыми итерабильными свойствами времени компиляции. А это немного другой оператор.
Так я и писал только про точки, это ты зачем-то приплёл сюда третий оператор.