gpt4 book ai didi

c++ - 为什么我的 forward_ 函数不适用于右值?

转载 作者:行者123 更新时间:2023-12-03 09:26:07 27 4
gpt4 key购买 nike

我已经明白了 std::move仅用于练习并实现了我自己的版本。现在我想了解如何 std::forward作品:
到目前为止,我已经实现了这一点:

#include <iostream>


template <typename T>
T&& forward_(T&& x)
{
return static_cast<T&&>(x);
}


/*template <typename T>
T&& forward_(T& x)
{
return static_cast<T&&>(x);
}*/

void incr(int& i)
{
++i;
}

void incr2(int x)
{
++x;
}

void incr3(int&& x)
{
++x;
}

template <typename T, typename F>
void call(T&& a, F func)
{
func(forward_<T>(a));
}


int main()
{

int i = 10;
std::cout << i << '\n';
call(i, incr);
std::cout << i << '\n';

call(i, incr2);
std::cout << i << '\n';

call(0, incr3); // Error: cannot bind rvalue reference of type int&& to lvalue of type int.

std::cout << "\ndone!\n";
}
为什么我必须提供过载的 forward(T&)版本采用左值引用?据我了解,转发引用可以根据其参数的类型产生左值或右值。所以传递纯右值文字 0call随着 incr3接受类型为 int&& 的右值引用的函数一般不需要 forward<T>(T&) ?!
  • 如果我取消评论 forward_(T&)版本它工作正常!?
  • 我仍然困惑:为什么如果我只使用 forward_(T&)版本是否适用于任何值(value)类别?那么让一个转发引用有什么意义forward_(T&&) ?
  • 如果我取消注释采用左值引用 T& 的版本和一个转发引用T&&然后代码工作正常,我在两者中添加了一些消息来检查哪个调用了。结果是 T&& 的那个从来没叫过!
      template <typename T>
    T&& forward_(T& x)
    {
    std::cout << "forward_(T&)\n";
    return static_cast<T&&>(x);
    }

    template <typename T>
    T&& forward_(T&& x)
    {
    std::cout << "forward_(T&&)\n";
    return static_cast<T&&>(x);
    }
  • 我的意思是在上面显示的驱动程序中运行相同的代码。
  • 最佳答案

    一个 T&&如果您手动指定 T,引用将不再是转发引用(而不是让编译器推断它)。如果T不是左值引用,则 T&&是一个右值引用,不接受左值。
    例如,如果你做 forward_<int>(...) , 那么参数是一个右值引用和 ...只能是右值。
    但如果你这样做 forward_(...) ,则参数为转发引用和...可以有任何值类别。 (虽然这样称呼它没有意义,因为 forward_(x) 将具有与 x 本身相同的值类别。)

    关于c++ - 为什么我的 forward_ 函数不适用于右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65098198/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com