在WG21 N0131比尔·吉本斯说:
default arguments are often considered an anachronism because they can be replaced with overloaded functions
我理解像这样的单个函数:
void f(T t = t0, U u = u0);
可以用三个重载代替:
void f() { f(t0); }
void f(T t) { f(t, u0); }
void f(T t, U u);
但我不明白的是为什么后者比前者更受欢迎? (这就是他所说的“不合时宜”的意思,对吧?)
Google 风格指南中有一些相关讨论:Google C++ Styleguide > Default Arguments ,但我看不出它如何回答问题或支持 Gibbons 的主张。
有人知道他在说什么吗?为什么默认参数被认为是无政府主义?
最佳答案
根据我自己的经验,问题是在与其他语言功能交互时违反了最小惊讶原则。假设您有一个经常使用 f
的组件。 IE。你会在很多地方看到这个:
f();
通过阅读它,您假设您有一个不带参数的函数。因此,当您需要添加与其他具有注册功能的组件的交互时:
void register(void (*cb)());
你做了显而易见的事情......
register(f);
... 你会立即得到一个漂亮的 Shiny 错误,因为 f
的声明类型是一个接受两个参数的函数。卧槽!?所以你看声明就明白了……对……
默认参数通过编译器“伪造”调用站点来使您的代码以某种方式运行。它并不是真正地调用不带参数的函数,而是隐式初始化两个参数来调用函数。
另一方面,重载集的行为确实符合人们的预期。编译器不会“伪造”调用站点,当我们尝试 register(f)
时......它有效!
https://stackoverflow.com/questions/69278080/