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
// ...
}
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.)