我是不是该std::forward
当我将函数参数用作参数时std::forward_as_tuple
?
template<class ... List>
void fn(List&& ... list){
// do I need this forward?
call_fn( forward_as_tuple( forward<List>(list)... ) );
}
我知道它们将存储为右值引用,但是我还应该考虑其他什么吗?
你必须使用std::forward
为了保留参数的值类别fn()
。由于参数的名称在fn
,它们是左值,并且没有std::forward
它们将始终被传递给std::forward_as_tuple
.
可以使用以下方式证明差异下面的例子 http://ideone.com/yYvNNP:
template<typename T>
void bar2(T&& t)
{
std::cout << __PRETTY_FUNCTION__ << ' '
<< std::is_rvalue_reference<decltype(t)>::value << '\n';
}
template<typename T>
void bar1(T&& t)
{
std::cout << __PRETTY_FUNCTION__ << ' '
<< std::is_rvalue_reference<decltype(t)>::value << '\n';
bar2(std::forward<T>(t));
bar2(t);
}
bar1
总是将其参数传递给bar2
,一旦与std::forward
一次没有。现在让我们用左值和右值参数来调用它们。
foo f;
bar1(f);
std::cout << "--------\n";
bar1(foo{});
Output:
void bar1(T&&) [with T = foo&] 0
void bar2(T&&) [with T = foo&] 0
void bar2(T&&) [with T = foo&] 0
--------
void bar1(T&&) [with T = foo] 1
void bar2(T&&) [with T = foo] 1
void bar2(T&&) [with T = foo&] 0
正如您从输出中看到的,在这两种情况下,都没有使用std::forward
,参数作为左值传递给bar2
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)