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.
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!
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.
Tags und Links c++ language-lawyer pass-by-reference overloading