2015-06-26 8 views
8

Czytałem this. Odpowiedź udzielona przez @NPE rozmów o interesujących faktów historycznych & mówi, żedlaczego słowo kluczowe "przeciążenie" zostało usunięte z C++?

  • Na początku C++ tam kiedyś specjalnego słowa kluczowego (przeciążenie), które miały być wykorzystane do zadeklarować jako identyfikator przeciążone;

Więc, co jest powodem usuwania przeciążenia słów kluczowych? Nie mam Design and Evolution of C++ od Stroustrup. Co jest nie tak z słowem kluczowym overload?

Odpowiedz

9

Stroustrup wspomina D & E 11.2.4 „słowa kluczowego overload”, że słowo kluczowe overload powoduje problemy, gdy „łączenie” (lub używając) dwie biblioteki, które wykorzystywane zarówno tę samą nazwę funkcji (bez nazw *). Na przykład sqrt w nagłówku C math.h versus sqrt(complex) z nagłówka C++ complex. Jeśli jeden z nich ogłosił funkcję jak przeciążania, ale z drugiej strony nie trzeba było by zawierała wszystkie nagłówki w takiej kolejności, że przeciążenia została włączona przed wystąpieniem go:

// #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); 

ewentualnego obejścia są „nie do opanowania w wszystkie najprostsze przypadki ".

(*) stanowi overload kluczowe powstał przestarzały z CFront 2.0, wydany w 1989 roku Namespaces zostały wprowadzone do projektu standaryzacji w 1993

The pierwotnym zamiarem było słowo kluczowe do czynienia z dwoma obaw:

  1. Obawa, że ​​mogą wystąpić niewykryte niejasności.
  2. Obawa, że ​​program nie może być poprawnie powiązany, chyba że programista wyraźnie zadeklarował, które funkcje miały być przeciążone.

Dawny strach okazał się w dużej mierze bezpodstawny. Nieliczne problemy występujące w rzeczywistym użytkowaniu są rozwiązywane przez niezależne od zleceń reguły dotyczące przeładowania. Ten ostatni strach okazał się nie mieć podstaw w ogólnym problemie z C oddzielnymi regułami kompilacji, które nie miały nic wspólnego z przeciążaniem.

+2

Proszę kupić/pożyczyć/przeczytać D & E. To naprawdę świetna książka z wieloma oświecającymi spostrzeżeniami. – dyp

+0

@PravasiMeet To biblioteka języka C. Myślę, że dodanie czegoś takiego jak '#ifdef __cplusplus/* newline */overload sqrt;/* newline */# endif' może być uważane za jedno z tych "niewykonalnych" obejść, lub niemożliwe, jeśli zewnętrzny nagłówek biblioteki nie może zostać zmieniony – dyp

+0

proszę wyjaśnić, co masz na myśli mówiąc dokładnie, pisząc "niemożliwe, jeśli zewnętrzny nagłówek biblioteki może nie zostać zmienionym "? – Destructor

Powiązane problemy