为什么默认参数落后于?

Ash*_*ish 9 c++

为什么C++中的默认参数是尾随的?

ten*_*our 14

如果你有void func(int a = 0, int b);,你如何指定在调用此函数时使用默认参数?

  • "看起来很难看"从未成为C++的设计标准. (11认同)
  • 我知道你不能用C++,但其他语言用`func(,some_val_for_b)`或命名参数处理它. (6认同)
  • 有什么问题?如果你传递一个参数,它显然会被绑定到`b`(因为它还会去哪里?)如果你传递两个参数,第一个被绑定到`a`而第二个绑定到'b`,因为,再一次,没有别的意义.那里没有歧义.一个列表是对称的,毕竟它从任何一方看起来都是一样的.所以,如果你认为在参数列表的末尾放置默认参数是可以的,并且由于列表是对称的,你在逻辑上*有*接受将它们放在开头的事实也同样如此. (3认同)
  • @Dominic Rodger,好吧,C++没有.如果你想要你可以起诉Stroupstroup:P (2认同)
  • Stroupstroup:很好:) (2认同)

Mat*_* M. 6

因为这就是语言的设计方式.

一个更有趣的问题是:有哪些替代方案?

假设你有 void f(A a = MyA, B b);

  • 占位符/空白参数:f(_, abee)f(, abee)
  • 命名参数(如在Python中): f(b = abee)

但这些都是细节,当然不是必需的,因为与Python不同,C++支持函数重载:

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

因此默认参数是不必要的...特别是考虑到与多态代码一起使用时存在问题,因为默认参数是静态解析的(编译时).

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 !!)
}
Run Code Online (Sandbox Code Playgroud)

关于命名参数:

可以使用函数对象模拟该功能.

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)();
}
Run Code Online (Sandbox Code Playgroud)

如果您不想复制参数,您可以使用引用/指针,尽管它可能会变得复杂.

当你有很多默认值没有真正的优先顺序时,这是一个方便的习惯用法.