Насколько я понимаю, фундаментальные типы — это Scalar, а массивы — агрегированные, но как насчет пользовательских типов? По каким критериям я бы разделил их на две категории?
struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;
Укороченная версия: Типы в C ++:
Типы объектов: скаляры, массивы, классы, объединения
Типы ссылок
Типы функций
(Типы членов) [см. Ниже]
void
Длинная версия
Типы объектов
Скаляры
арифметическое (целое, плавающее)
указатели: T *
для любого типа T
перечисление
указатель на член
nullptr_t
Массивы: T[]
или же T[N]
для любого полного не ссылочного типа T
Классы: class Foo
или же struct Bar
Тривиальные занятия
сводные показатели
POD классы
(и т. д. и т. д.)
Союзы: union Zip
Типы литературы: T &
, T &&
для любого объекта или типа свободной функции T
Типы функций
Бесплатные функции: R foo(Arg1, Arg2, ...)
Функции-члены: R T::foo(Arg1, Arg2, ...)
void
Типы членов работают так. Тип члена имеет форму T::U
, но вы не можете иметь объекты или переменные типа члена. Вы можете иметь только участника указатели. Указатель на член имеет тип T::* U
и это указатель на член-объект, если U
является (свободным) типом объекта, и указатель на член-функцию, если U
является (свободным) типом функции.
Все типы завершены, кроме void
, нестандартные массивы и объявленные, но не определенные классы и объединения. Все неполные типы, кроме void
может быть завершено.
Все типы могут быть const
/volatile
Квалифицированный.
<type_traits>
Заголовок предоставляет классы признаков для проверки каждой из этих характеристик типа.
Я думаю, что это был бы более полный ответ:
оригинальный документ:
http://howardhinnant.github.io/TypeHiearchy.pdf
скаляр является фундаментальным, за исключением того, что он не может быть пустым, но это может быть тип указателя или тип enum.
А также фундаментальный имеет ключевое слово в языке. это легко узнать, когда так сказано.
Существует ряд библиотечных классов, которые используются для проверки типа переменных. std::is_scalar
может использоваться для проверки, является ли объект скаляром.
скалярный тип это тип, который имеет встроенную функциональность для оператора сложения без перегрузок (арифметика, указатель, указатель на член, перечисление и
std::nullptr_t
).
Также стол из Вот.