使用 std::forward 禁用模板参数推导
为什么使用 std::forward 禁用模板参数推导?
std::forward 函数在某些实现中(例如 VS2010)使用名为identity 的模板元函数来禁止模板参数推导。这样做是为了在涉及左值引用和 const 左值引用的情况下保持对 std::forward 行为的精确控制。
使用模板参数推导的含义
如果std::forward 使用模板参数推导,这会导致根据输入参数的类型推断模板参数 (T)。当输入参数是左值或 const 左值(例如,具有名称的变量)时,此行为会出现问题。在这种情况下,模板参数推导会错误地将 T 推导为左值引用或 const 左值引用,从而导致错误的类型转换。
考虑以下示例:
<code class="cpp">template<typename T> T&& forward_with_deduction(T&& obj) { return static_cast<T&&>(obj); }</code>
传递命名变量时或常量到forward_with_deduction,它会错误地将它们解释为左值引用或常量左值引用,从而导致 T 被推导。因此,static_cast 操作会将类型折叠为左值引用或 const 左值引用,尽管需要通用引用 (T&&)。
示例:
<code class="cpp">int x; int&& z = std::move(x); // Incorrectly deduces T to be int& and casts z as int& forward_with_deduction(z); // calls test(int&) instead of test(int&&)</code>
std::forward 中的解析
为了确保在所有情况下参数的正确转换,std::forward 使用了恒等元函数。身份充当占位类型,阻止编译器推导模板参数。因此,std::forward 始终将输入参数解释为通用引用,无论其实际类型如何。
通过将输入参数转换为通用引用,std::forward 可以完美转发对象,即使它们是左值或 const 左值。此行为可确保转发参数的类型在整个转发过程中保持通用引用。
以上是为什么 `std::forward` 禁用模板参数推导?的详细内容。更多信息请关注PHP中文网其他相关文章!