C++ r值引用返回类型语义?

C++ r值引用返回类型语义?,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,像这样的返回类型在c++11中代表有意义的东西吗 template <typename R> R&& grabStuff(); T instance = grabStuff<T>(); 模板 R&&grabStuff(); T instance=grabStuff(); 如果R没有移动构造函数,我希望grabStuff应该抛出一个编译时错误,因为这似乎不允许返回类型使用复制构造函数,这可能有意义,这取决于你想用它做什么,以及你是如何实现函数的 实际上

像这样的返回类型在c++11中代表有意义的东西吗

template <typename R>
R&& grabStuff();

T instance = grabStuff<T>();
模板
R&&grabStuff();
T instance=grabStuff();

如果
R
没有移动构造函数,我希望
grabStuff
应该抛出一个编译时错误,因为这似乎不允许返回类型使用复制构造函数,这可能有意义,这取决于你想用它做什么,以及你是如何实现函数的

实际上,
std::move
返回类型是
T&
(右值引用),这很有意义,因为它定义了在C++11库中存在
std::move
的目的:


与往常一样,在返回引用时,必须返回对函数返回后仍处于活动状态的对象的引用。如何做到这一点取决于你自己。例如:

T global_thing;

T && get() { return std::move(global_thing); }

struct Foo { Foo(T &&); /* ... */ };

int main()
{
    global_thing.reset();
    Foo a(get());
    global_thing.reset();
    Foo b(get());
}

返回右值引用的更典型示例是
std::move
本身,它返回对传递给它的对象的引用(因此调用方负责提供有效的输入)。

如果函数的返回类型是右值引用,则函数调用的结果是xvalue;如果返回类型为非引用,则函数调用的结果为prvalue

xvalue和prvalue都是右值,它们之间有一些细微的区别,更像是参考值和非参考值之间的区别。例如,xvalue可能具有不完整类型,而prvalue通常应具有完整类型或void类型。当typeid应用于类型为多态类类型的xvalue时,结果引用动态类型;对于prvalue,结果引用静态类型

对于您的声明语句
T instance=grabStuff(),如果T是一个类类型,我认为在这个上下文中xvalue和prvalue之间没有区别


初始值设定项是右值,因此编译器首选移动构造函数。但是如果没有声明move构造函数,并且声明了一个带有const reference参数的复制构造函数,那么将选择这个复制构造函数,并且没有错误。我不知道你为什么希望这是个错误。如果这是一个错误,那么从右值复制初始化某个对象时,任何旧代码都将不正确。

std::move
是右值引用返回类型的唯一有意义的实例。它在用户代码中永远不会有意义。@ildjarn:我不能说“它在用户代码中永远不会有意义”。我只是说作为返回类型的右值引用可能是有意义的。我是这么说的。.-]在用户代码中(除非该用户代码出于某种奇怪的原因复制了
std::move
),否则右值引用返回类型不能做任何语义上有意义的事情。@ildjarn:声明这种类型的内容为时尚早;C++11刚刚发布,在接下来的10年里,许多技巧和习惯用法将被发现。因此,我宁愿祈求好运。你可以A)得到一个悬而未决的参考,或者B)暗示所有权的变更而不保证,这是完全没有用的。就是这样。对象不必是全局对象。资源管理本地对象也是一个例子(我的意思是,可能是:D)。@Kerrek,那么您的意思是,这个函数应该只在临时对象中调用?在您的示例中,
get()
的结果不能分配给
Foo&
的正常引用吗?@Nawaz:是的,正如我所说,这取决于您。。。我只想给出一个不是std::move本身的例子。@lurscher:您也可以将结果绑定到引用:
Foo&&rr=get()