«Прозрачная» функция: идеальная пересылка аргумента в возвращаемое значениеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 «Прозрачная» функция: идеальная пересылка аргумента в возвращаемое значение

Сообщение Anonymous »

Я пытаюсь понять, как может выглядеть сигнатура полностью прозрачной функции. То есть функция, принимающая аргумент и само по себе (т.е. исходя из возвращаемого значения) выглядит точно так же, как

Код: Выделить всё

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?
}
Таким образом, это, очевидно, вращается вокруг универсальной ссылки T&&.
Я думаю, что смогу разобраться в первых четырех примерах с помощью свертывания ссылок:
  • give Rvalue -> T — это C, t — это Rvalue-ref внутри, тип возвращаемого значения — Rvalue-ref, который перемещается в на return
  • give Lvalue -> T — это C&, t — это Lvalue-ref внутри, тип возвращаемого значения — Lvalue-ref, который копируется в b ( — это инициализация, использует copy-ctor)
  • 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»