cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

Пофиксить потенциально разную семантику у `typedef` и `using` #442

Open yeputons opened 3 years ago

yeputons commented 3 years ago

Мелочь, навеянная вот этим вопросом на SO: https://stackoverflow.com/questions/48613758/using-vs-typedef-is-there-a-subtle-lesser-known-difference

dcl.typedef/2 сообщает, что using A = struct {}; и typedef struct {} A; должны быть эквивалентны:

A typedef-name can also be introduced by an alias-declaration. ... Such a typedef-name has the same semantics as if it were introduced by the typedef specifier. ...

Дальше можно посмотреть конструкцию typedef struct {} A; на верхнем уровне кода, которая относительно ожидаемо заводит тип A с external linkage из-за правила [basic.link]/4.3](https://eel.is/c++draft/basic.link#4.3). Но, к сожалению, это правило пишет про "typedef declaration", что можно интерпретировать как "typedef declaration, but not alias declaration". То есть using A = struct {}; уже не линкуется.

Вероятно, GCC этим и занимается: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99931

Предлагаю поправить и поменять в этом месте "typedef declaration" на что-то вроде "typedef declaration or alias declaration". Наверняка захочется зацепить ещё соседние кусочки про enum.