Each language may impose its own restrictions on exactly what can be passed as a parameter.
Any expression can be passed 'by value', but C++ constructors and destructors will not be invoked. Evaluating parameters can involve evaluating nested calls.
Anything whose address can be taken can be passed 'by reference'.
The debugger has very limited understanding of array descriptors.
Comma is both the argument separator and a valid operator in C and C++. Hence, argument lists are comma-separated assignment-expressions rather than full expressions.
argument-expression-list
: assignment-expression
| assignment-expression COMMA argument-expression-list
arg-expression-list-opt
: [ argument-expression-list ]
assignment-expression