gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:30:51 25 4
gpt4 key购买 nike

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) 时......它有效!

关于c++ - 默认参数与重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69278080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com