Plugin system for calling methods
First, you are not storing &amp;&amp;, but rather &amp;. Why? because plugin1 etc. are lvalue references, and because of the reference collapsing rules.

Second, you can use a tuple of references as you would use a reference itself. That is, everything is fine unless you return a tuple of references to local objects, in which case references are dangling.

Third, between forwarding (forward_as_tuple) and copying (make_tuple) there's another option:

template&lt;class... A&gt;
constexpr std::tuple&lt;A...&gt; auto_tuple(A&amp;&amp;... a)
{
    return std::tuple&lt;A...&gt;(std::forward&lt;A&gt;(a)...);
}


which keeps a reference to lvalues, and copies rvalues only. I find this most convenient.

In general, storing references or objects depends on what you want to do. Think of what you would choose if it was only one object, then keep the same choice for the tuple.

Check here for more.