Ashish
Ashish

Reputation: 8529

Why are default arguments trailing ones?

Why are default arguments in C++ trailing ones?

Upvotes: 11

Views: 4009

Answers (4)

Matthieu M.
Matthieu M.

Reputation: 299790

Because that is how the language has been designed.

A more interesting question would be: what are the alternatives?

Suppose you have void f(A a = MyA, B b);

  • Placeholder / blank argument: f(_, abee) or f(, abee)
  • Named arguments (like in Python): f(b = abee)

But those are niceties and certainly not necessary, because unlike Python C++ supports function overloading:

  • void f(A a, B b);
  • void f(B b) { f(MyA, b); }

and thus the default arguments are unnecessary... especially considering that there are issues when used with polymorphic code because default arguments are statically resolved (compile-time).

struct Base
{
  virtual void func(int g = 3);
};

struct Derived
{
  virtual void func(int g = 4);
};

int main(int argc, char* argv[])
{
  Derived d;
  d.func(); // Derived::func invoked with g == 4

  Base& b = d;
  b.func(); // Derived::func invoked with g == 3 (AH !!)
}

Regarding named parameters:

The feature can be emulated using function objects.

class Func
{
public:
  Func(B b): mA(MyA), mB(b) {}

  A& a(A a) { mA = a; }
  B& b(B b) { mB = b; }

  void operator()() { func(mA, mB); }
private:
  A mA;
  B mB;
};

int main(int argc, char* argv[])
{
  A a;
  B b;
  Func(b)();
  Func(b).a(a)();
}

In case you don't want to copy the arguments, you have the possibility to use references/pointers though it can get complicated.

It's a handy idiom when you have a whole lot of defaults with no real order of priority.

Upvotes: 6

user184968
user184968

Reputation:

Just to supplement @tenfour's answer. C++ FAQ Lite has a topic describing named parameters and I think the topic addresses your issue to some extent.

Upvotes: 1

Federico klez Culloca
Federico klez Culloca

Reputation: 27119

Because in a function call you have to call the non-default arguments in any case. If you put your default argument at the beginning of the argument list, how are you supposed to say you are setting the default argument or the other ones?

Upvotes: -1

tenfour
tenfour

Reputation: 36896

if you had void func(int a = 0, int b);, how would you specify to use the default parameter in calling this function?

Upvotes: 16

Related Questions