将函数的返回类型声明为T &&是没有意义的吗?

xml*_*lmx 13 c++ temporary return-type rvalue-reference c++11

众所周知,在大多数情况下,T&&意味着"这是一个临时对象".但是,如果想要从函数返回临时对象,他/她可以按如下方式声明函数:

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

    return t;
}
Run Code Online (Sandbox Code Playgroud)

或(注意:不正确)

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

    return t;
}
Run Code Online (Sandbox Code Playgroud)

但我认为后者是过度的,因为前者足够向后兼容.

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

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

Ste*_*sop 13

在你的例子中,这T&&是错误的,这是一个悬垂的参考.

但是,std::forward它不会在自己的定义中返回对局部变量的rvalue引用,它会返回对其by-rvalue-reference参数的rvalue引用(或者对by-lvalue-reference参数的左值引用).

只有当您希望函数的调用者能够从引用引用的任何内容移动时,才应返回右值引用.

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

正如灰熊所说,有时由于参考折叠,你可以利用技巧,这意味着你输入 T&&你的代码,但什么时候T已经是左值引用类型T&&是相同的左值引用类型.std::forward使用那个技巧.也就是说,由于参考折叠T&&并不意味着"右值参考T",它意味着"T如果T是参考类型,否则右值参考T".