Must default function parameters be constant in C++?
Asked Answered
N

3

49
void some_func(int param = get_default_param_value());
Nissie answered 2/12, 2008 at 18:4 Comment(0)
G
62

Default parameter can be a subset of the full set of expressions. It must be bound at compile time and at the place of declaration of the default parameter. This means that it can be a function call or a static method call, and it can take any number of arguments as far as they are constants and/or global variables or static class variables, but not member attributes.

The fact that it is bound at compile time and in the place where the function is declared also means that if it makes use of a variable, that variable will be used even if a different variable shadows the original at the place of the function call.

// Code 1: Valid and invalid default parameters
int global = 0;
int free_function( int x );

class Test
{
public:
   static int static_member_function();
   int member_function();

   // Valid default parameters
   void valid1( int x = free_function( 5 ) );
   void valid2( int x = free_function( global ) );
   void valid3( int x = free_function( static_int ) );
   void valid4( int x = static_member_function() );

   // Invalid default parameters
   void invalid1( int x = free_function( member_attribute ) ); 
   void invalid2( int x = member_function() );
private:
   int member_attribute;
   static int static_int;
};

int Test::static_int = 0;

// Code 2: Variable scope
int x = 5;
void f( int a );
void g( int a = f( x ) ); // x is bound to the previously defined x
void h()
{
   int x = 10; // shadows ::x
   g(); // g( 5 ) is called: even if local x values 10, global x is 5.
}
Gynandry answered 2/12, 2008 at 20:21 Comment(3)
I didn't realize you could refer to global variables. Good resources at publib.boulder.ibm.com/infocenter/comphelp/v8v101/… and msdn.microsoft.com/en-us/library/e1dbzf09(VS.80).aspx .Hachmann
It can also be a call through a function pointer, ie. if foo(int arg=(*fp)()); Here, fp is looked up in the scope where foo is declared, but *fp is evaluated every time foo() is called.Cosmism
Bottom line should read g( f( 5 ) ) and not g( 5 ), but I can't correct as the edit is too small.Kameko
N
12

They don't have to be! A default parameter can be any expression within certain limitations. It is evaluated every time the function is called.

Nissie answered 2/12, 2008 at 18:5 Comment(0)
S
0

David Rodríguez - dribeas answear is great, but doesn't provide a solution.
It may look like there is no solution.

Solution is quite simple: repalce default parameter with function/method overload.

void some_func(int param);
void some_func() {
    some_func(get_default_param_value());
}
Swanky answered 20/1, 2020 at 12:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.