建议std::forward
通常仅限于完美转发函数模板参数的规范用例;一些评论员甚至说这是std::forward
. 但考虑这样的代码:
// Temporarily holds a value of type T, which may be a reference or ordinary
// copyable/movable value.
template <typename T>
class ValueHolder {
public:
ValueHolder(T value)
: value_(std::forward<T>(value)) {
}
T Release() {
T result = std::forward<T>(value_);
return result;
}
private:
~ValueHolder() {}
T value_;
};
在这种情况下,不会出现完美转发的问题:因为这是一个类模板而不是函数模板,客户端代码必须明确指定T
,并且可以选择是否以及如何对其进行 ref 限定。同样,参数 tostd::forward
不是“通用参考”。
尽管如此,std::forward
这里似乎很合适:我们不能把它排除在外,因为当它T
是只移动类型时它不起作用,我们不能使用它,因为它在是左值引用类型std::move
时不起作用T
. 当然,我们可以部分专门ValueHolder
针对引用和std::move
值使用直接初始化,但这在std::forward
完成这项工作时似乎过于复杂。这似乎也是一个合理的概念匹配的含义std::forward
:我们试图一般地转发可能是也可能不是引用的东西,只是我们将它转发给函数的调用者,而不是我们调用的函数我们自己。
这是合理的使用std::forward
吗?有什么理由避免它吗?如果是这样,首选的选择是什么?