gpt4 book ai didi

c++ - std::forward 和 std::forward 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 21:57:37 26 4
gpt4 key购买 nike

这些功能是否等效?

template <class T>
void foo(T && t)
{
bar(std::forward<T>(t));
}

template <class T>
void foo2(T && t)
{
bar(std::forward<decltype(t)>(t));
}

template <class T>
void foo3(T && t)
{
bar(std::forward(t));
}

如果是,我是否可以始终使用此宏进行完美转发?

#define MY_FORWARD(var) std::forward<decltype(var)>(var)

或者直接使用

bar(std::forward(t));

我相信 foo2foo3是一样的,但我发现人们总是像 foo 这样使用向前,是否有任何理由显式编写类型?

我了解 TT&&是两种不同的类型,但我认为 std::forward<T>std::forward<T&&>总是给出相同的结果?


编辑:

我想使用宏的原因是我想在下面的 C++1y 代码上节省一些输入,我在不同的地方有很多类似的代码

#define XLC_FORWARD_CAPTURE(var) var(std::forward<decltype(var)>(var))
#define XLC_MOVE_CAPTURE(var) var(std::move(var))

template <class T, class U>
auto foo(T && func, U && para )
{
auto val = // some calculation
return [XLC_FORWARD_CAPTURE(func),
XLC_FORWARD_CAPTURE(para),
XLC_MOVE_CAPTURE(val)](){
// some code use val
func(std::forward<U>(para));
};
}

最佳答案

Are these functions two equivalent?

是的,它们是等价的。 decltype(t)T&& 相同,与 std::forward 一起使用时,与 T< 没有区别T&&,不管 T 是什么。

Can I always use this macro for perfect forwarding?

是的,你可以。如果你想让你的代码不可读和不可维护,那就这样做吧。但我强烈建议不要这样做。一方面,使用这个宏基本上没有任何收获。另一方面,其他开发人员必须查看定义才能理解它,这可能会导致细微的错误。例如添加额外的括号将不起作用:

MY_FORWARD((t))

相比之下,带有 decltype 的表单是完全有效的。特别是,它是从泛型 lambda 表达式转发参数的首选方式,因为没有显式类型参数:

[](auto&& t) { foobar(std::forward<decltype(t)>(t)); }

我忽略了带有 std::forward(t) 的第三个变体,因为它无效。


更新:关于您的示例:您可以使用 call-by-value 而不是 call-by-reference 作为函数模板 foo。然后你可以使用 std::move 代替 std::forward。这为代码添加了两个额外的移动,但没有额外的复制操作。另一方面,代码变得更加简洁:

template <class T, class U>
auto foo(T func, U para)
{
auto val = // some calculation
return [func=std::move(func),para=std::move(para),val=std::move(val)] {
// some code use val
func(std::move(para));
};
}

关于c++ - std::forward<T> 和 std::forward<decltype(t)> 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23321028/

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