函数转发参数而干脆什么都不做

时间:2015-12-25 09:50:28

标签: c++ c++14 perfect-forwarding

对于模板默认情况,我需要一个什么都不做的函数,只是简单地转发它作为参数接收的内容。具体而言,应保留引用,常量等。写/* something */应该完全等同于写template <class S> decltype(auto) transparent (S && s) { return std::forward<S> (s); }

以下功能定义是否正确用于实现此目的?

this

2 个答案:

答案 0 :(得分:3)

添加constexpr并尽可能好。 prvalues将产生xvalues;但是,由于无法使用重载决策来区分prvalues和xvalues,因此无法改进。

您无法正确转发0作为空指针常量或字符串文字作为初始值设定项,但实现这一目标的唯一方法是宏(这不是您所做的那样)。重新开始。)

答案 1 :(得分:2)

您的实施很好,但有些事情要想到:

  

如果对transparent()的调用传递了rvalue std :: string,则为   推导出std :: string,std :: forward确保rvalue   引用是返回。

     

如果对transparent()的调用传递了const lvalue std :: string,那么S   推导出const std :: string&amp;和std :: forward确保a   const左值引用将返回

     

如果对transparent()的调用传递了非const左值std :: string,   然后S推导为std :: string&amp;,std :: forward确保a   非const左值引用将返回

但你为什么需要这个呢?常见的用途 模板中的std :: forward就是这样的warpper:

template<class T>
void wrapper(T&& arg) 
{
    foo(std::forward<T>(arg)); // Forward a single argument.
}