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

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

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

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

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

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

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

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


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

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


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

Б>более близко выглядело бы ((std::numeric_limits<double>*)nullptr)->epsilon(), для статики.

Б>разыменования здесь нет...
Б>для перехода в точку можно было бы написать (*(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.

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

Ну так я и писал только о тех двух операторах, о которых шла речь: https://rsdn.org/forum/cpp/9068221.1
Автор: B0FEE664
Дата: 19.03 18:07
. Это ты зачем-то приплёл сюда третий.
Re[12]: так компайл тайм рефлекшину быть 26-й стандарт ??
Здравствуйте, ботаныч, Вы писали:

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

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

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

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


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

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


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

Б>более близко выглядело бы ((std::numeric_limits<double>*)nullptr)->epsilon(), для статики.

Б>разыменования здесь нет...
Б>для перехода в точку можно было бы написать (*(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.

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

Ну так я и писал только о тех двух операторах, о которых шла речь: https://rsdn.org/forum/cpp/9068221.1
Автор: B0FEE664
Дата: 19.03 18:07
. Это ты зачем-то приплёл сюда третий.