我正在读这个.@NPE给出的答案讲述了有趣的历史事实并说,
那么,删除重载关键字的原因是什么?我没有Design and Evolution of C++Stroustrup.有关重载关键字有什么问题?
Stroustrup在D&E 11.2.4" overload关键字"中提到,overload当"合并"(或使用)两个使用相同函数名称(没有名称空间*)的库时,关键字会引起麻烦.例如,sqrt在C头math.h与sqrt(complex)C++ complex头中的对比.如果其中一个声明该函数是可重载的,但另一个没有声明,则必须按照在发生重载之前启用重载的顺序包含标头:
// #include <complex>
overload sqrt;
complex sqrt(complex);
// #include <math.h>
double sqrt(double); // fine
// ---------------------------
// #include <math.h>
double sqrt(double);
// #include <complex>
overload sqrt; // ERROR: cannot allow overloading
// of an already declared function
complex sqrt(complex);
Run Code Online (Sandbox Code Playgroud)
可能的解决方法是"在除最简单的情况之外的所有情况下都无法管理".
(*)该overload关键字在1989年发布的CFront 2.0中已经过时.命名空间在1993年被引入标准化提案.
关键字的初衷是解决两个问题:
- 担心可能会出现未检测到的含糊之处.
- 关注程序无法正确链接,除非程序员明确声明哪些函数应该被重载.
前者的恐惧基本上没有根据.在实际使用中发现的少数问题由与订单无关的重载解决规则处理.事实证明后者的恐惧没有基础与C单独的编译规则的一般问题,这些规则与重载无关.