For C++ type names T
and S
,
the above discussion is summarized in the following table.
Form of Decl. Sort of x (used as global) Sort of x^, x' (when x is global) ------------- -------------------------- --------------------------------- T x Obj[T] T const T x ConstObj[T] T T & x Obj[T] T const T & x ConstObj[T] T T & const x Obj[T] T T * x Obj[Ptr[Obj[T]]] Ptr[Obj[T]] const T * x Obj[Ptr[ConstObj[T]]] Ptr[ConstObj[T]] T * const x ConstObj[Ptr[Obj[T]]] Ptr[Obj[T]] T x[3] Arr[Obj[T]] Arr[T] const T x[3] Arr[ConstObj[T]] Arr[T] struct STS { T t; S s; }; STS x; ConstObj[STS] STS const STS x; ConstObj[Const[STS]] Const[STS] union UST { S s; T t; }; UST x; Obj[UST] UST const UST x; ConstObj[Const[UST]] Const[UST] int x(int i); ConstObj[cpp_function] cpp_function
Note that the use of a state-function such as '
and ^
(see section 6.2.1 State Functions)
peels off the outermost Obj
or ConstObj
generator from the sort.
See section 6.2.1 State Functions for an explanation of the shorthands
x^
and x'
for an array name x
.
See section 11.7 Array Types for the traits that define array sorts.
When these types are composed, the sort becomes the composite
of the sorts given.
The only apparent exception is the interaction of const
and references.
When composing arrays with references and pointers, one has to take the
C++ precedence rules into account
(e.g., []
has higher precedence than *
).
The following are a few examples.
Declaration Sort of x (used as global) ------------- -------------------------- const int &const x; ConstObj[int] const int *const x; ConstObj[Ptr[ConstObj[int]]] const int x[3][4]; Arr[Arr[ConstObj[int]]] int *x[10]; Arr[Obj[Ptr[Obj[int]]]] int (*x)[10]; Obj[Ptr[Arr[Obj[int]]]] int *x[10][4]; Arr[Arr[Obj[Ptr[Obj[int]]]]] int (*x)[10][4]; Obj[Ptr[Arr[Arr[Obj[int]]]]] int *const x[10]; Arr[ConstObj[Ptr[Obj[int]]]] int ***x; Obj[Ptr[Obj[Ptr[Obj[Ptr[Obj[int]]]]]]] struct Str { char *s; int len; }; Str x; ConstObj[Str] struct IntList { int val; IntList *next; }; IntList x; ConstObj[IntList] const IntList x; ConstObj[Const[IntList]] const int& x(int a[]); ConstObj[cpp_function] int (*x)(int i); Obj[Ptr[ConstObj[cpp_function]]] int (* const x)(int i); ConstObj[Ptr[ConstObj[cpp_function]]] int (*x[10])(int i); Arr[Obj[Ptr[ConstObj[cpp_function]]]]
Go to the first, previous, next, last section, table of contents.