Ist das Überladen der Funktion durch Referenz zulässig, wenn keine Mehrdeutigkeit besteht?

8

Betrachten Sie folgenden Code:

%Vor%

Ich verstehe, dass es eine Mehrdeutigkeit für foo(m) einführt, aber ist dies zulässig, wenn der Ausdruck vom Typ int ist (oder ein anderer, der in int konvertiert werden kann)?

Ich habe versucht, eine Standardreferenz dazu zu finden, aber ohne Glück.

Haftungsausschluss : Beachten Sie, dass es kein Duplikat von Überladen der Funktion basierend auf Wert gegenüber Const-Referenz . Die const Referenzen sind unterschiedlich, da sie mit rvalues ​​ zugewiesen werden können, im Gegensatz zu "normalen", nicht const Referenzen.

    
Grzegorz Szpetkowski 16.07.2015, 12:21
quelle

2 Antworten

7

Ja, das ist erlaubt.

Es gibt keine Regel, um diese Überlastung zu verhindern.

  

[C++14: 13.1/1]: Nicht alle Funktionsdeklarationen können überladen werden. Diejenigen, die nicht überladen werden können, werden hier angegeben. [..]

     

[C++14: 13.1/2]: (bla bla viele Ausnahmen, die keine für diesen Fall enthalten)

Es wäre extrem einschränkend für die Sprache, Funktionsüberladungen zu verbieten, die möglicherweise in bestimmten Szenarien mit bestimmten Aufrufen mehrdeutig sind, und ohne guten Grund könnte ich hinzufügen!

    
Lightness Races in Orbit 16.07.2015, 12:31
quelle
9

13.1 [over.load] ist ziemlich klar (abgesehen von einer mehrseitigen Notiz), welche Funktionen nicht im selben Umfang überladen werden können.

Ihr Fall ist dort nicht aufgelistet, und Sie können diese Überlastungen deklarieren, Sie können sie einfach nicht einfach verwenden. Sie könnten den lvalue wie folgt aufrufen:

%Vor%

Dies vermeidet die Mehrdeutigkeit, die auftritt, wenn Sie foo(m) aufrufen.

Nebenbei: Eine andere Möglichkeit, foo(m + 0) zu schreiben ist einfach foo(+m) , der unäre + Operator konvertiert den lvalue in einen rvalue, so dass die foo(int) overload aufgerufen wird.

    
Jonathan Wakely 16.07.2015 12:32
quelle