Cpp2 использует классы STL C++. Вместо массивов нужно использовать контейнерные типы STL. Для базовых целых типов предлагается использовать имена i8, u8, i16, u16, i32, u32, i64, u64.
Также можно использовать стандартные типы char, wchar_t, short, int, long, float, double и типы из пространства имен std (например, std::size_t, std::int_fast32_t). Так как в Cpp2 название типа не может состоять из двух или более слов, то определены типы longdouble, longlong (i64), ulonglong (u64), ushort (u16), uint (u32), ulong (unsigned long).
Унарные операции (``++``, ``--``, ``*``, ``&``, ``~``) записываются слева направо после аргумента. ``++`` и ``--`` возвращают значение после изменения, то есть работают как префиксные в С++.
Префиксными являются унарные операции ``!`` (``not``), ``+`` и ``-``.
Бинарные операции нужно отделять пробелами от аргументов.
Операции с указателями запрещены, кроме операции ``*``.
Синтаксис объявления переменной:
> *имя* ``:`` *тип* ``=`` *значение* ``;``
Если тип совпадает с типом значения, то можно написать:
> *имя* ``:=`` *значение* ``;``
Если значение переменной не присвоено при объявлении, то оно должно быть присвоено до первого использования. Можно указать несколько значений в круглых скобках при создании составного объекта или пустые скобки для создания объекта со значением по умолчанию.
Примеры:
```c++
x:int = 5;
a:i32; // без начального значение
b:= 3.5; // double
c:double = (); // по умолчанию 0.0
eps:longdouble = 1e-9;
v:std::vector<int> = (1,2,3); // вектор из 3 значений
v2:std::vector<int> = (); // пустой вектор
```
Символ ``*`` (указатель) и ``const`` указываются перед основным типом.
```c++
p:*int = nullptr;
```
Операция ``is`` проверяет, что выражение слева имеет указанные справа тип или значение. Значение, отличное от константы, нужно заключать в скобки, также можно указать имя булевой функции. Если слева указать тип, то выполняется проверка, что тип слева является производным от базового типа справа или типы совпадают.
Операция ``as`` преобразует выражение слева к указанному справа типу. Если тип справа является указателем на производный тип, то при невозможности преобразования возвращается ``nullptr``.
```c++
a:int = 5;
x:= a as double;
std::println("{}",x is double); // true
std::println("{}",x is int); // false
std::println("{}",x is 5.0); // true
std::println("{}",x is 1.0); // false
```
В строку можно подставлять выражения в ``()$``, которые будут преобразованы в строку с помощью ``to_string``.
```c++
a:int=5;
std::cout<<"Результат (2 * a)$\n"; // Результат 10
```