【发布时间】:2018-07-28 17:27:12
【问题描述】:
例如,而不是
void shared_ptr::reset() noexcept;
template <typename Y>
void shared_ptr::reset(Y* ptr);
可能会想到
template <typename Y = T>
void shared_ptr::reset(Y* ptr = nullptr);
我认为这里的性能差异可以忽略不计,第二个版本更简洁。 C++ 标准采用第一种方式有什么具体原因吗?
same question 已被要求使用 Kotlin 语言,并且首选默认参数。
更新:
std::unique_ptr::reset() 遵循默认参数设计(请参阅here)。所以我认为std::shared_ptr::reset() 使用重载的原因是因为它们有不同的异常规范。
【问题讨论】:
-
你知道,我不再那么确定我的(已删除)答案了。您提出的版本应该没问题(减去较弱的异常规范)。
-
不知道 ISO 委员会的具体动机,但一般来说,具有不同的功能(无论是重载还是使用不同的名称)会导致程序流的结构更加静态。这本身就是一个优势;例如,您和您的 IDE 确切地知道每个版本的调用位置,这使得手动和自动代码分析更加容易。您还可以专门为一个版本或另一个版本设置调试断点。
-
哦,我会厌倦在其他编程语言中应用任何 Kotlin 指南。 Kotlin 是一门非常年轻的语言(甚至不到 8 岁),在谷歌将它用于 Android 开发之前它的用户群很小,我想即使是今天的大多数用户也只是在 Android 前端开发的背景下才知道它。 Kotlin 确实看起来很有趣,但对于一种新的编程语言,并没有真正经过验证的指南,因为没有人可以尝试和测试过它们。与已经存在 33 年的 C++ 相比。
标签: c++ overloading language-lawyer api-design default-arguments