在 std::forward 中禁用模板参数推导
问题:
为什么是 template Visual Studio 2010 中 std::forward 的实现禁用了参数推导?
答案:
std::forward 是一个用于完美转发的实用函数,其中输入参数的类型保留在输出参数中。但是,如果在 std::forward 中启用了模板参数推导,则在某些情况下可能会导致不正确的行为。
具体来说,如果输入参数是左值或 const 左值(即具有名称的对象) ),模板参数推导会将参数类型推导为左值或 const 左值引用。在完美的转发场景中,这不是我们想要的,因为目标是保留输入参数的确切类型。
为了说明潜在的问题:
<code class="cpp">template<typename T> void test(T&& obj) { // ... } int main() { int x; int& y = x; test(7); // input is an rvalue, so T is deduced as int&& test(x); // input is an lvalue, so T is deduced as int& test(y); // input is a named lvalue, so T is deduced as int& }</code>
在此例如,如果 std::forward 使用模板参数推导,则 test(x) 和 test(y) 中的参数类型将被错误地推导为 int&,从而导致意外行为。
为了防止此问题, std::forward 的实现使用恒等元函数来显式指定类型参数,从而有效地禁用模板参数推导。这确保了输入参数的类型保留在输出参数中,无论它是右值还是左值。
以上是为什么 Visual Studio 2010 中的 std::forward 中的模板参数推导被禁用?的详细内容。更多信息请关注PHP中文网其他相关文章!