gpt4 book ai didi

c++ - 将函数的返回类型声明为T&&是不是没有意义?

转载 作者:IT老高 更新时间:2023-10-28 21:44:43 25 4
gpt4 key购买 nike

众所周知,在大多数情况下,T&& 的意思是“这是一个临时对象”。但是,如果想要从函数中返回一个临时对象,他/她可以将函数声明如下:

template<class T>
T f()
{
T t;
......

return t;
}

或(注:不正确)

template<class T>
T&& f()
{
T t;
......

return t;
}

但我认为后者有点过头了,因为前者已经足够了,并且向后兼容。

然而,我也发现 std::forward() 的返回类型被声明为 T&&,所以我确信我对此的理解是不完整的。

我真正的问题是:我们应该在何时何地将函数的返回类型声明为 T&&?

最佳答案

在您的示例中,T&& 是错误的,它是一个悬空引用。

但是 std::forward 不会在它自己的定义中返回对局部变量的右值引用,它会返回对其按右值引用参数的右值引用(或对一个按左值引用的参数)。

只有当您希望函数的调用者能够从该引用所指的任何地方移动时,您才应该返回一个右值引用。

通常只有当函数的目的是提供对某些重要对象(可能已经存在)的移动访问时才会如此。这包括 std::move (它允许您从左值移动),类似地,您可以编写一个专门为用户设计的访问器函数,以便从某个对象的数据成员或元素中移动一些容器。如果对象本身不重要,只有值,则可以按值返回。

正如 grizzly 所说,有时由于引用崩溃,您可以利用技巧,这意味着您在代码中键入 T&&,但是当 T 已经是左值引用类型 T&& 是相同的左值引用类型。 std::forward 使用了这个技巧。也就是说,由于引用折叠 T&& 并不是“对 T 的右值引用”,而是“如果 T 是引用类型则为 T,否则为 T 的右值引用”。

关于c++ - 将函数的返回类型声明为T&&是不是没有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14605483/

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