Код: Выделить всё
TКод: Выделить всё
T. То есть функция, которая пересылает свой аргумент в возвращаемое значение.
Рассмотрим этот пример:
#include
template
T&& manipulate(T&& t) {
/* manipulate t (but do not move from t - t stays valid) */
return std::forward(t);
}
class C { };
void fun1(C &&) { }
void fun2(C &) { }
int main() {
C x;
// Examples:
C a = manipulate(C()); // 1: ok
C b = manipulate(x); // 2: ok
C& c = manipulate(x); // 3: ok
// C& d = manipulate(C()); // 4: not ok
fun1( manipulate(C()) ); // 5a: ok?
// fun2( manipulate(C()) ); // 5b: not ok?
// fun2( manipulate(C()) ) // 6a: not ok?
fun2( manipulate(x) ); // 6b: ok?
}
Я думаю, что смогу разобраться в первых четырех примерах с помощью свертывания ссылок:
- give Rvalue -> T — это C, t — это Rvalue-ref внутри, тип возвращаемого значения — Rvalue-ref, который перемещается в на return
- give Lvalue -> T — это C&, t — это Lvalue-ref внутри, тип возвращаемого значения — Lvalue-ref, который копируется в b (— это инициализация, использует copy-ctor)
Код: Выделить всё
b=... - give Lvalue -> T — это C&, t — это Lvalue-ref внутри, тип возвращаемого значения — Lvalue-ref -> c привязан к x
- give Rvalue -> T — это C, t — это Rvalue-ref внутри тип возвращаемого значения — Rvalue-ref -> невозможно связать это со ссылкой
Здесь я нашел похожий ответ.
Подробнее здесь: https://stackoverflow.com/questions/798 ... turn-value
Мобильная версия