对于模板默认情况,我需要一个什么都不做的函数,只是简单地转发它作为参数接收的内容。具体而言,应保留引用,常量等。写/* something */
应该完全等同于写template <class S>
decltype(auto) transparent (S && s) { return std::forward<S> (s); }
。
以下功能定义是否正确用于实现此目的?
this
答案 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.
}