тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 12:27
Оценка: 30 (3)
https://discourse.llvm.org/t/rfc-clang-adding-strong-typedefs/88843

ех! хотят классную штуку попробовать в кланге и протянуть в стандарт
сейчас для этого приходиться говнокодить тип врапер обертку
хотя иногда можно и из буста поюзать
но накладно по сравнению с предлагаемым вариантом
Re: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 12:49
Оценка: +3
Здравствуйте, Великий Мессия, Вы писали:

ВМ>ех! хотят классную штуку попробовать в кланге и протянуть в стандарт


А можно ведь было бы вот так сделать, без всяких этих дурацких атрибутов:

typedef protected int apples_t;
typedef protected int oranges_t;


И совместимости вроде не рушит, и выглядит осмысленно.
Re: тянут в кланг и стандарт strong typedef
От: sergii.p  
Дата: 20.11.25 13:06
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>https://discourse.llvm.org/t/rfc-clang-adding-strong-typedefs/88843


в том виде в котором есть, надеюсь, инициативу зарубят.
Для UserId уже есть enum class

__attribute__((strong)) typedef int UserId;
enum class UserId{};


Для метров уже есть boost.units и новая поделка близко не удовлетворит потребностям.
Если сравнивать с другими языками, то это просто жалкие крохи. Например underlying типы поддерживают операцию +. Надо дать пользователю решать должен ли strong type поддерживать эту операцию. И если должен, то дать возможность переопределить. Почему подход с enum class и популярен. Он из коробки даёт операцию <=>

Как по мне, самый простой путь — доработать подход с enum class. Чтобы underlying type мог быть любым:
enum class PassportId: std::string { Invalid = "" };
Re[2]: тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 13:22
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Великий Мессия, Вы писали:


ВМ>>ех! хотят классную штуку попробовать в кланге и протянуть в стандарт


Pzz>А можно ведь было бы вот так сделать, без всяких этих дурацких атрибутов:


Pzz>
Pzz>typedef protected int apples_t;
Pzz>typedef protected int oranges_t;
Pzz>


Pzz>И совместимости вроде не рушит, и выглядит осмысленно.


а вдруг уже зарезервированные кейворды нельзя юзать в других контекстах
к тому же зная по рассказам полухина как люди мыслят в комитете стандартизации
если что то вносится, то проверяют тянется ли оно
и если тянется, то начинают тянуть во все стороны

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

атрибуты выглядят в этом плане более нейтрально
Re[2]: тянут в кланг и стандарт strong typedef
От: B0FEE664  
Дата: 20.11.25 14:30
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Как по мне, самый простой путь — доработать подход с enum class. Чтобы underlying type мог быть любым:

SP>
SP>enum class PassportId: std::string { Invalid = "" };
SP>

1. Это сейчас реализуется очень просто. Два дня назад пример приводил здесь
Автор: B0FEE664
Дата: 18.11 17:35

2. Глядя на то как программисты всё время кастят переменные типов enum к underlying type и обратно я сильно подозреваю, что большинству хватит набора констант:
struct PassportId { inline const static std::string Invalid = ""; };

или даже так:
namespace PassportId { inline const static std::string Invalid = ""; };
И каждый день — без права на ошибку...
Отредактировано 20.11.2025 14:30 B0FEE664 . Предыдущая версия .
Re[3]: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 14:33
Оценка: +1
Здравствуйте, Великий Мессия, Вы писали:

ВМ>Здравствуйте, Pzz, Вы писали:


ВМ>к примеру сразу начнут тянуть во все стороны эти протектед, т.е. если есть протектед значит можно и паблик и приват

ВМ>пробовать, а это уже какой то треш будет

auto же втянули в совершенно другом смысле, чем он был задуман. Тоже могли сказать, что где auto, там и static/extern.

ВМ>атрибуты выглядят в этом плане более нейтрально


Они синтаксически очень громоздки.
Re[4]: тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 14:54
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Великий Мессия, Вы писали:


ВМ>>Здравствуйте, Pzz, Вы писали:


ВМ>>к примеру сразу начнут тянуть во все стороны эти протектед, т.е. если есть протектед значит можно и паблик и приват

ВМ>>пробовать, а это уже какой то треш будет

Pzz>auto же втянули в совершенно другом смысле, чем он был задуман. Тоже могли сказать, что где auto, там и static/extern.


введя новое с С++11 они отменили старое

ВМ>>атрибуты выглядят в этом плане более нейтрально


Pzz>Они синтаксически очень громоздки.


что да то да
но в каждом компиле как помню вроде есть еще и свой набор таких атрибутов
поэтому для откатать идею хотя бы в кланге — сойдет

тогда уж какой нибудь новый кейворд
Re[3]: тянут в кланг и стандарт strong typedef
От: sergii.p  
Дата: 20.11.25 15:02
Оценка:
Здравствуйте, B0FEE664, Вы писали:

SP>>
SP>>enum class PassportId: std::string { Invalid = "" };
SP>>

BFE>1. Это сейчас реализуется очень просто. Два дня назад пример приводил здесь
Автор: B0FEE664
Дата: 18.11 17:35


это шутка? Офигеть как просто. На каждый тип заводить структуру на 100 строк. enum class здесь нужен не как перечисление, а просто обёртка для типа, чтобы запретить неявные касты и дать из коробки операции сравнения. Это способ создать strong type быстро и по месту. То что вы привели — совсем из другой оперы.
Re[5]: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 15:24
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

Pzz>>Они синтаксически очень громоздки.


ВМ>что да то да

ВМ>но в каждом компиле как помню вроде есть еще и свой набор таких атрибутов
ВМ>поэтому для откатать идею хотя бы в кланге — сойдет

Ну, шланг и gcc сговариваются, и у них плюс-минус одинаковый набор атрибутов. А MS живёт где-то в своей собственной вселенной...

ВМ>тогда уж какой нибудь новый кейворд


Низя. Тогда код, который использовал это слово в качестве имени переменной, резко станет невалидным. А мы так не договаривались.
Re[6]: тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 16:19
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Великий Мессия, Вы писали:


ВМ>>тогда уж какой нибудь новый кейворд


Pzz>Низя. Тогда код, который использовал это слово в качестве имени переменной, резко станет невалидным. А мы так не договаривались.


можно, иначе бы новых кейвордов не вводили вообще
а их вводят
Re[7]: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 16:25
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

Pzz>>Низя. Тогда код, который использовал это слово в качестве имени переменной, резко станет невалидным. А мы так не договаривались.


ВМ>можно, иначе бы новых кейвордов не вводили вообще

ВМ>а их вводят

Они имеют полное право вводить кейворды, которые начинаются с подчёрка, потому, что все символы, которые начинаются с подчёрка, зарезервированы на нужды реализации, и если вдруг какой-то из них станет недоступным, пользователю обижаться не на что.

Но кейворды с подчёрком смотрятся, как дерьмо полное.

А кейворды без подчёрка они разве когда-либо вводили?
Re[8]: тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 20:22
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>А кейворды без подчёрка они разве когда-либо вводили?


начиная с С++11 их огогооооо

alignas alignof
consteval constexpr constinit
co_await co_return co_yield decltype
import export
nullptr
concept requires
static_assert
thread_local
Re[9]: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 21:00
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

Pzz>>А кейворды без подчёрка они разве когда-либо вводили?


ВМ>начиная с С++11 их огогооооо


ВМ>alignas alignof

ВМ>consteval constexpr constinit
ВМ>co_await co_return co_yield decltype
ВМ>import export
ВМ>nullptr
ВМ>concept requires
ВМ>static_assert
ВМ>thread_local

И впрямь. Ну что за уродский язык? Прям как Питон...
Re[10]: тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 21:05
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>И впрямь. Ну что за уродский язык? Прям как Питон...


уродство это когда весь синтаксис на пробелах построен
Re[11]: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 21:07
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

Pzz>>И впрямь. Ну что за уродский язык? Прям как Питон...


ВМ>уродство это когда весь синтаксис на пробелах построен


Это отдельное уродство, чисто питонячее.

Но принимать ломающие совместимость изменения в язык — такое себе.
Re[4]: тянут в кланг и стандарт strong typedef
От: andrey.desman  
Дата: 20.11.25 21:22
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Они синтаксически очень громоздки.


Да не особо они громоздкие, если родные плюсовые.
[[strong]] typedef int UserId;
Re[12]: тянут в кланг и стандарт strong typedef
От: Великий Мессия google
Дата: 20.11.25 21:26
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Но принимать ломающие совместимость изменения в язык — такое себе.


совместимость снизу вверх сохраняется
именно это и является гирей С++ которая не дает ему развиваться быстрее
Re[13]: тянут в кланг и стандарт strong typedef
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.25 21:36
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

Pzz>>Но принимать ломающие совместимость изменения в язык — такое себе.


ВМ>совместимость снизу вверх сохраняется

ВМ>именно это и является гирей С++ которая не дает ему развиваться быстрее

Ну как сохраняется? Если у тебя в программе переменная/класс/функция назывались import или export, то с того момента, как эти слова стали ключевыми, твоя программа больше не собирается.

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

Наверное, я слишком Go избалован. Там и совместимость не принято ломать даже по мелочи, и tytedef-ы отродясь строгие. И ключевых слов новых не вводят.

P.S. К слову сказать, в Go int и т.п. — не ключевое слово, а просто название предопределенного типа. Можно этим словом свой тип или переменную назвать. Поэтому если они добавят новый предопределенный тип, это ничего не сломает: предопределенные типы находятся в самом внешнем scope, и если такое слово определено более локально, оно так и продолжит использоваться, а если не определено, значит программа и раньше не компилировалась.
Re: тянут в кланг и стандарт strong typedef
От: so5team https://stiffstream.com
Дата: 21.11.25 04:11
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>https://discourse.llvm.org/t/rfc-clang-adding-strong-typedefs/88843


Да неужели! Не прошло и 40 лет. Хотя, погодите-ка...

> Unit confusion: meters vs yards, seconds vs milliseconds


ИМХО, для этого лучше бы подошло предложение по библиотеке units от разработчиков mp-units.

> ID confusion: mixing user IDs, product IDs, session IDs

> Domain-specific types: file descriptors vs PIDs, different kinds of handles

А вот за это лайк.

Только, если правильно понимаю, официально это может оказаться разве что в C++29.
Re[10]: тянут в кланг и стандарт strong typedef
От: so5team https://stiffstream.com
Дата: 21.11.25 04:12
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>И впрямь. Ну что за уродский язык?


Красота в глазах смотрящего.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.