gpt4 book ai didi

c++11 - 标准前向实现和引用折叠

转载 作者:行者123 更新时间:2023-12-03 14:54:53 24 4
gpt4 key购买 nike

在 scott meyers 的书中,他提到了一个像这样的 std forward 实现(不符合 std 标准)

template <typename T>
T&& forward(typename remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}

问题是为什么我们需要在这里删除引用?

所以典型的前向用法将在通用引用函数中,如下所示:
template <typename T>
void f(T&& fparam)
{
g(forward<T>(fparam)); // assume there is g function.
}

没有删除引用,转发看起来像这样
template <typename T>
T&& forward(T& param);

现在这两种情况是:
  • fparam 是右值,在这种情况下,在 f 函数内部,T 推导出为
    非引用对象类型,因此前向调用采用参数
    左值引用并将其转换为 T&&(因为 T 是非引用)。
  • fparam 是左值然后在 f 中 T 被推导出为 T& 然后向前
    将(作为参数)一个对左值引用的引用(折叠到左值
    引用)然后静态转换将是 T& && 这又是左值
    引用。

  • 那么为什么我们需要从 forward 的参数中删除引用呢?它是否与禁止推导类型有关?有人可以给出详细的解释。

    被引用为重复的问题不是,答案基本上是说 std 库使用了删除引用,但为什么呢?

    最佳答案

    Does it have to do with disallowing deducing types maybe?



    是的, typename std::remove_reference<T>::type介绍了 non-deduced context .它可以防止用户误写...
    std::forward(something)

    ...并强制他/她提供一个明确的模板参数:
    std::forward<T>(something)

    关于c++11 - 标准前向实现和引用折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42947358/

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