【问题标题】:Why default parameters are not allowed before non-default ones? [closed]为什么在非默认参数之前不允许使用默认参数? [关闭]
【发布时间】:2013-03-06 10:53:33
【问题描述】:

Probable duplicate

所以这是不允许的

void foo (int a, int b = 10, int c);

但是为什么呢?为什么不允许这样称呼它?两个连续的逗号表示“使用默认参数”。

foo (20,,30);

除了“这不允许,因为这是不允许的”和“这是不允许的,因为没有人把它提交给委员会”之外,还有什么真正的理由吗?

编辑: 好的,这个呢

void bar (int a, int b, int c = 1, 
          int d = 2, int e = 3, 
          int f = 4, int g = 5, int h = 6);

有效的声明,但是我想跳过除h 之外的所有默认参数。

能够做到这一点不是很好吗:

bar (20, 30, , , , , , 10);

【问题讨论】:

  • 我会说foo (20,,30); 是个坏主意,因为通过阅读代码,我无法判断默认参数的值是什么或它的含义。但是,我知道它就在那里,这让我很烦恼。当您最后遗漏了默认参数时,该函数仍应读取正确。例如,std::sort(begin, end) 是完全可以理解的,std::sort(begin, end, std::greater) 也是如此。如果比较函数是第二个参数,那么如果不阅读文档,这里缺少的参数会让我感到困惑:std::sort(begin,,end);
  • @sftrabbit "...我不知道默认参数的值是什么":嗯,与默认参数的可用语法相同...
  • @aleguna:你认为这带来了什么好处值得增加复杂性和模糊性?
  • 命名参数应该来救援
  • 不知道为什么它被“非建设性”关闭。 D&E有一个明确的原因。应改为“重复”关闭,请参阅stackoverflow.com/questions/1123725/…

标签: c++


【解决方案1】:

我不了解设计该语言的人,但我发现 f (20,,30); 非常难以阅读。

【讨论】:

  • 嗯,对我来说这是完全可读的,而且很明显默认值将用于缺少的 arg
  • FTR,我使用了支持这一点的语言,这个观点是从那个经验中得出的。我不喜欢数逗号。
  • 想想如果有更多的参数 f (20,,a,1,,,30) 会如何可读...
  • 伙计们,这可能被f (20,,a,1,,,30)严重滥用这一事实无关紧要。
  • @Brendan:foo(1,2,,,,)foo(1,2) 之间并没有真正的区别。在这两种情况下,快速浏览一下就会告诉您前两个参数有值,而其余的则没有。问题是在foo(1,,,,,2) 中这并不明显,您需要count 个字符和一个小字符,以了解2 的含义。比语言可以支持命名参数 foo(1,arg5=2) 更好,这将是可读的并允许跳过中间参数。这是很久以前为标准提出的,由于单独的编译模型而被放弃(如果需要可以扩展)
猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 2013-05-31
  • 2017-11-13
  • 1970-01-01
  • 2012-02-14
  • 2012-07-25
  • 2019-12-14
  • 2011-12-10
相关资源
最近更新 更多