Kürzlich habe ich versucht, move Semantik zu verstehen und kam mit einer Frage.Unterschied zwischen std :: forward implementation
Die Frage wurde bereits diskutiert here.
implementiert ich die erste Variante und geprüft, ob es l-Wert oder r-Wert zurückgibt:
#include <iostream>
using namespace std;
template <typename T>
T&& my_forward(T&& x) {
return static_cast<T&&> (x);
}
int main() {
int a = 5;
&my_forward(a); // l-value
return 0;
}
Also, wenn ich l-Wert übergeben, gibt sie l-Wert (compiliert, weil ich nehmen kann eine Adresse von l-Wert), und wenn ich das tun:
&my_forward(int(5)); // r-value with int&& type
Mein Code kompiliert nicht, weil my_forward r-Wert zurückgegeben. In der obigen Frage sagen sie, dass der Unterschied zwischen dieser Implementierung und Standart (mit std :: remove_reference und 2 verschiedenen Argumenten mit & und & &) ist, dass meine Implementierung den l-Wert die ganze Zeit zurückgibt, aber wie ich gezeigt habe es gibt sowohl den r-Wert als auch den l-Wert zurück.
Also frage ich mich, warum kann ich nicht std :: forward wie das implementieren? In welchen konkreten Fällen wird es einen Unterschied zwischen den Standardfällen geben? Warum sollte ich T auch als Vorlage angeben und darf es sich nicht mit einem Argumenttyp definieren lassen?
Warum sind Sie Adresse von rvalue Bezug zu nehmen versuchen? – xinaiz
@BlackMoses Um die r-Wertigkeit zu überprüfen. – LogicStuff
@LogicStuff Ah, okay, dachte, es war ein Missverständnis von '&' Verwendung :) – xinaiz