Недавно я пытался понять семантику перемещения и задал вопрос.Разница между std: forward forward
Вопрос уже обсуждался here.
я реализовал первый вариант и проверяется, возвращает ли он л-значение или т-значение:
#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;
}
Так что, если я передать л-значение, то оно возвращает л-значение (компилируется, потому что может принять адрес из L-значение), и если я могу это сделать:
&my_forward(int(5)); // r-value with int&& type
Мой код не компилируется, потому что my_forward вернулся г-значение. В вопросе выше говорят, что разница между этой реализацией и стандартным (с std :: remove_reference и двумя разными аргументами с & и & & соответственно) заключается в том, что моя реализация постоянно возвращает l-значение, но, как я показал он возвращает как r-значение, так и l-значение.
Так что я удивляюсь, почему я не могу реализовать std :: forward вроде этого? В каких конкретных случаях он будет показывать разницу между стандартным? Кроме того, почему я должен указывать T как шаблон и не могу позволить ему определять себя с типом аргумента?
Почему вы пытаетесь принять адрес ссылки RValue? – xinaiz
@BlackMoses Чтобы проверить r-ценность. – LogicStuff
@LogicStuff А, хорошо, подумал, что это неправильное представление об использовании '&' :) – xinaiz