c++ - 默认参数与重载?

在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/

相关文章:

python - pandas- fetch_pandas_all 连接器杀死内核

python - 如何使用 PyAnsys 和 PyVista 创建共享拓扑

kubernetes - 为什么容器内存使用量在 cAdvisor 指标中翻倍?

sql - 这个参数化查询是否对SQL注入(inject)开放?

sql - 将计数设置为变量

r - 使用 dplyr 嵌套或分组两个变量,然后对数据执行 Cronbach's alpha 函数

python - 如何在 glob() 模式中写入 "or"?

python - 使用 dataframe pandas 中的 value_counts 创建新列

c# - 如何在 C# 控制台应用程序中计算正确?

python - 基于 2 个数据帧的 pandas 高效数据操作