В коде ниже мы получаем:
12 4
у
typeid().name должен возвращать тип данных,
но я не могу найти, какой тип данных 'y' означает 🤔
void alignment()
{
struct Foo
{
int i;
float f;
char c;
};
std::cout << sizeof(Foo) << '\t' << alignof(Foo) << '\n';
auto x = alignof(Foo);
std::cout << typeid(x).name() << '\n';
}
Я пытался найти связь с именами типов данных, но ничего не подходит
Результат typeid().name() определяется реализацией. Который, по сути, имеет некоторые ограничения, налагаемые стандартом, но в рамках этих ограничений реализация может создать любую строку, которая ей нравится. Практически ограничений не так много — нет гарантии, что два разных типа будут иметь разные имена, нет гарантии, что результатом будет понятная человеку строка.
@ 273K фаза полудня... так что это зависит от того, происходит ли это до обеда или после обеда.
Если вам нужна определенная ассоциация имени, вы можете создать собственное сопоставление std::unordered_map<std::type_info const*, std::string>. Boost сделал это с помощью #include <boost/type_index.hpp>, чтобы получить их pretty_name(), или #include <boost/core/demangle.hpp>, чтобы получить их запутанное имя typeid(T).name().





Я пытался найти связь с именами типов данных, но ничего не подходит
Ваш компилятор дал std::size_t имя y, мой назвал его m, оба правы и полностью разрешены.
В соответствии с:
https://en.cppreference.com/w/cpp/types/type_info/имя
Некоторые реализации (например, MSVC, IBM, Oracle) создают удобочитаемое имя типа. Другие, особенно gcc и clang, возвращают искаженное имя, указанное в Itanium C++ ABI. Искаженное имя можно преобразовать в удобочитаемую форму с помощью API-интерфейса, специфичного для реализации, такого как abi::__cxa_demangle, напрямую или через boost::core::demangle. Его также можно передать через утилиту командной строки c++filt -t.
И alignof возвращает size_t, смотрите здесь.
Пример с разборкой этого с помощью Boost: https://godbolt.org/z/8959KdMhv
На самом деле вы оба используете совместимые компиляторы, но size_t — это псевдоним unsigned long long (он же y) в Windows и unsinged long в Linux (он же m по той же спецификации). typeid возвращает имя типа с псевдонимом.
typeid().name должен возвращать тип данных. Нет, не должно, это зависит от компилятора, его версии, полуденной фазы и так далее.