gpt4 book ai didi

c++ - 完美转发和 std::forward 的使用

转载 作者:太空狗 更新时间:2023-10-29 20:02:19 25 4
gpt4 key购买 nike

我目前正在尝试弄清楚完美转发的工作原理。我已经编写了一段示例代码,据我所知,它可以按预期执行完美的转发:

void whatIsIt(std::vector<int>&& variable)
{
std::cout << "rvalue" << std::endl;
}

void whatIsIt(std::vector<int>& variable)
{
std::cout << "lvalue" << std::endl;
}

template <class T>
void performPerfectForwarding(T&& variable)
{
whatIsIt(std::forward<T>(variable));
}

int main(int argc, char** argv)
{
std::vector<int> lvalue;
performPerfectForwarding(lvalue);
performPerfectForwarding(std::move(lvalue));

return 0;
}

使用左值调用函数 performPerfectForwarding 会调用相应的 whatIsIt 重载,这同样适用于使用右值调用它。因此,此代码生成的输出是:

lvalue
rvalue

但是,我问自己以下版本的函数 performPerfectForwarding 会做什么:

1.

template <class T>
void performPerfectForwarding(T& variable)
{
whatIsIt(std::forward<T>(variable));
}

2.

template <class T>
void performPerfectForwarding(T variable)
{
whatIsIt(std::forward<T>(variable));
}

它们都输出:

rvalue
rvalue

现在,我的问题是:这两个替代版本会做什么,它们在任何可能的上下文中是否有意义?与它们在上述“正确”版本中的应用相比,引用折叠规则在这些情况下如何应用?

最佳答案

template <class T>
void performPerfectForwarding(T& variable)
{
whatIsIt(std::forward<T>(variable));
}

variable 不是forwarding-reference 时,T 被推断为T,即使对于左值 (与推导为 T& 不同)。因此,这会将 variable 转换为 rvalue reference,因为:

forward<T> -> T&&
forward<T&> -> T&
forward<T&&> -> T&&

template <class T>
void performPerfectForwarding(T variable)
{
whatIsIt(std::forward<T>(variable));
}

同样的注意事项也适用于此。 T 永远不会是左值引用,因此forward 将始终转换为右值引用


What would these two alternative versions do and would they make sense in any possible context?

我不这么认为,因为你的 forward 基本上是一个 move


How do the reference collapsing rules apply in these cases compared to how they apply in the aforementioned "correct" version?

规则在这里照常应用。记住:

&  &  -> &
& && -> &
&& & -> &
&& && -> &&

在这两种情况下,都无法让variable 成为&&

关于c++ - 完美转发和 std::forward<T> 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390070/

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