What are all the possible types of valid expressions for a default argument in a function or member function?
2 Answers
Anything that is correct within context of assignment to a variable of function parameter's type.
Edit
The default arguments during compilation are evaluated in terms of type correctness etc, but they are not calculated and no assignment takes place until run-time. You can specify a constructor of a yet to be defined class as a default argument and it's fine, as long as class is defined at the point of function use... The actual calculation/assignment takes place during function call, not at the point of function declaration/definition.
Example:
#include <iostream>
void foo( int a = std::rand())
{
std::cout << a << std::endl;
}
int main( void )
{
foo();
return( 0 );
}
1804289383
4 Comments
int a = std::rand(), but you can't do void Class::foo(int a = std::rand()).This is detailed in section 8.3.6 of the C++03 standard. It basically amounts to any expression that doesn't depend on anything in local scope, so any expression which depends on local variables, parameters to a function, or on "this" are excluded.
void(). Unfortunately Visual C++ 10.0 accepts it. Other than that there is no restriction on argument default expressions compared to expressions in general. (Except if you're thinking of non-copyable types or such, which is not a restriction on the expression kind but on the type). If you are interested in the syntactical categories, then consult the C++ BNF grammar. Cheers & hth.