2015-06-26 27 views
8

我在读this。约有趣的历史事实@NPE会谈给出&回答说,为什么从C++中删除重载关键字?

  • 在早期的c + +曾经有过那要 来声明为重载标识一个特殊的关键字(超载);

那么,什么是落后去除超载关键字的原因是什么?我没有Stroustrup的Design and Evolution of C++。超载关键字有什么问题?

回答

9

Stroustrup的提及在d &ë11.2.4“的overload关键字”该overload关键字引起麻烦时“合并”(或使用)两个库其中两个使用相同的函数名(没有命名空间*)。例如,C头math.h中的sqrt与C++ complex头中的sqrt(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); 

可能的解决办法是“在无法控制的除最简单的情况外“。

(*)的overload关键字是过时与CFRONT 2.0,于1989年命名空间释放被引入标准化的建议于1993年

关键字的初衷是处理两个担忧:

  1. 关注未检测到的歧义可能发生。
  2. 担心程序无法正确连接,除非程序员明确声明哪些函数应该是重载的 。

前者的恐惧很大程度上毫无根据。实际使用中发现的几个问题由独立于顺序的超载解决规则处理。后者的恐惧被证明在C分离编译规则的一般问题上没有任何基础,这与重载无关。

+2

请购买/借阅/阅读D&E。这真是一本很棒的书,有很多启发性的见解。 – dyp

+0

@PravasiMeet这是一个C库。我想增加一些像'#ifdef __cplusplus/* newline */overload sqrt;/* newline * /#endif'可能被认为是那些“难以管理的”解决方法之一,或者如果外部库头文件可能没有更改,则不可能解决此问题 – dyp

+0

请解释一下,不被改变“? – Destructor