Tag: FORWARDING-REFERENCE
La premisa completa sobre las referencias hacia adelante (también conocidas como referencias universales) es que esta función: template<typename t=””> void f(T&&) { } puede resultar en que el parámetro de la plantilla sea tanto int& como int, dependiendo si se llama con int a{}; f(a) o f(5) como ejemplo. Pero . . . Read more
Ejemplos de std::forward que he visto usarlo cuando se pasa el argumento a otra función, como este común desde cppreference: template<class t=””> void wrapper(T&& arg) { // arg siempre es una lvalue foo(std::forward<t>(arg)); // Forward como lvalue o como rvalue, dependiendo de T } También tiene un caso más complicado: . . . Read more
Considere el siguiente código: #include <functional> #include <iostream> struct S1 { S1(const std::function<void()>& func) : func{func} {} std::function<void()> func; }; struct S2 { template<typename f=””> S2(F&& func) : func{std::forward<f>(func)} {} std::function<void()> func; }; int main() { S1 s1{[]{ std::cout << “Se llamó a la función S1\n”; }}; S2 s2{[]{ std::cout . . . Read more
El enlace http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0644r1.html dice: Hay dos formas de reenviar una variable: se puede usar std::forward o se puede usar static_cast directamente (como lo hace el operador de reenvío de esta propuesta): template <class x,=”” class=”” y=””> decltype(auto) foo(X&& x, Y&& y) { return std::forward<x>(x)(std::forward<y>(y)); // con std::forward return static_cast<x&&>(x)(static_cast<y&&>(y)); // . . . Read more