So diagnostizieren Sie einen mehrdeutigen Aufruf von sqrt (int &) in g ++ 4.3.4

8

Mein Code ist wie folgt:

%Vor%

Der Aufruf in der letzten Zeile wird auch mit -pedantic -std=c++98 -Wall -Wextra nicht mehrdeutig gemeldet, funktioniert aber in anderen Compilern nicht unbedingt, aus dem gleichen Grund foo(i) nicht.

gcc fügt dem Namensraum std Folgendes hinzu:

%Vor%

Das heißt, es fügt inline double sqrt(X) für alle Integer-Typen X hinzu.

Ich schätze es, dass g ++ sein Bestes tut, um mir zu helfen, aber gibt es irgendeine (legitime) Möglichkeit, den Fehler in meinem Code zu diagnostizieren?

[Bearbeiten: Ich benutze gcc 4.3.4, aber wenn andere Versionen von gcc es diagnostizieren können, interessiert mich das auch!]

    
Steve Jessop 19.05.2011, 09:12
quelle

2 Antworten

2

Dieser "hilfreiche" Standardbibliothekszusatz von GCC ist nicht konform in C ++ 03, nach [lib.global.functions] / 2 :

  

Ein Aufruf einer globalen Funktionssignatur [beschrieben in der Standardbibliotheksdefinition] verhält sich genauso, als ob die Implementierung keine zusätzlichen globalen Funktionssignaturen deklariert.

Dies bedeutet, dass die Implementierung (gcc) keine zusätzlichen Überladungen hinzufügen darf (hilfreich oder nicht), solange sie das beobachtbare Verhalten des Programms beeinflussen.

    
decltype 19.05.2011, 09:48
quelle
2

Sie möchten das Zitat aus dem FDIS?

Letzter Absatz vom 26.8:

  

Darüber hinaus müssen zusätzliche Überlastungen vorhanden sein, um Folgendes sicherzustellen:

     
  1. Wenn ein Argument, das einem Parameter double entspricht, den Typ long double hat, werden alle Argumente, die den Parametern double entsprechen, effektiv in long double umgewandelt.

  2.   
  3. Andernfalls, wenn ein Argument, das einem double -Parameter entspricht, den Typ double oder einen Integertyp hat, werden alle Argumente, die double -Parametern entsprechen, effektiv in double umgewandelt.

  4.   
  5. Andernfalls werden alle Argumente, die den double -Parametern entsprechen, effektiv in float umgewandelt.

  6.   

In diesem Fall muss Punkt 2 gelten.

    
Bo Persson 19.05.2011 09:31
quelle

Tags und Links