Что такое скалярный объект в С++?

Насколько я понимаю, фундаментальные типы: Scalar и Arrays являются агрегатными, но как насчет пользовательских типов? По каким критериям я бы разделил их на две категории?

struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;

Ответ 1

Краткая версия: Типы на С++:

  • Типы объектов: скаляры, массивы, классы, союзы

  • Типы ссылок

  • Типы функций

  • (Типы участников) [см. ниже]

  • void


Длинная версия

  • Типы объектов

    • Скаляры

      • арифметика (интеграл, float)

      • указатели: 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> предоставляет классы признаков для проверки каждой из этих характеристик типа.

Ответ 2

Я думаю, что это был бы более полный ответ:

enter image description here

оригинал документа:
http://howardhinnant.github.io/TypeHiearchy.pdf

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

И фундаментальное имеет ключевое слово на языке. легко распознать, когда сказано так.

Ответ 3

Существует ряд классов библиотек, которые используются для проверки типа переменных. std::is_scalar можно использовать для проверки, является ли объект скаляром.

Скалярный тип - это тип, который имеет встроенные функции для оператора сложения без перегрузок (арифметика, указатель, указатель элемента, перечисление и std::nullptr_t).

Также таблица из здесь.

Категории типов С++