Warum hat foo(int&&) bei Überladung keine Priorität vor foo(int), um mit einem R-Wert übereinzustimmen?C++

Programme in C++. Entwicklerforum
Guest
 Warum hat foo(int&&) bei Überladung keine Priorität vor foo(int), um mit einem R-Wert übereinzustimmen?

Post by Guest »

Die folgenden Überladungen sind mehrdeutig (in C++23 GCC 14.2):

Code: Select all

#include 

void foo(int num) {}
void foo(int&& num) {}

int main() {
foo(5);
// error: call of overloaded 'foo(int)' is ambiguous
// note: candidate: 'void foo(int)'
// note: candidate: 'void foo(int&&)'

// same with a move:
int x = 5;
foo(std::move(x));
// error: call of overloaded 'foo(std::remove_reference::type)' is ambiguous
// ...
}
Ich habe erwartet, dass foo(int&&) Vorrang vor foo(int) haben würde, wenn die Funktion mit einem R-Wert aufgerufen wird. Wenn Sie sich zum Beispiel die umgekehrte Situation ansehen: Keine Überladungen, nur foo(int&&) ist deklariert und Sie rufen es auf einem L-Wert foo(x) auf. Es lässt sich nicht kompilieren, da der R-Wert-Verweis int&& den L-Wert int nicht binden kann. Da foo(int&&) ein engerer Fall ist als foo(int), sollte foo(int&&) in der überladenen Situation für den Rvalue-Fall bevorzugt werden.
Was ist der semantische Grund, warum foo(int&&) in dieser Überladungsauflösung keine höhere Priorität haben sollte? Vielleicht macht es überhaupt keinen Sinn, sich mit einer solchen Überladung herumzuschlagen?
Soweit ich weiß, sind beide Fälle int und int&& semantisch gleich innerhalb des Funktionskörpers foo(...). D.h. In beiden Fällen ist der Parameter num ein temporärer (auf dem Stapel) L-Wert im Funktionskörper, kein Verweis auf etwas, das den Benutzer von foo interessiert. Es macht also keinen Sinn, unterschiedliche Funktionskörper zu haben. Der Unterschied liegt in der Schnittstelle für den Benutzer: ob der Benutzer sich für ein Objekt interessiert und eine Kopie davon weitergeben möchte oder nicht. Wenn Sie jedoch beide Fälle von int- und int&&-Argumenten abdecken möchten, können Sie einfach foo(int) verwenden. Eine Überlastung ist nicht erforderlich. Und wenn Sie es eingrenzen möchten, haben Sie foo(int&&). (Die Vorstellung eines Parameters, der „nur kopiert“, der keine R-Werte binden kann, macht wenig Sinn.)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post