r值引用返回类型语义?

时间:2012-04-14 15:52:08

标签: c++ c++11 rvalue-reference

这样的返回类型是否代表c ++ 11中有意义的东西?

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

T instance = grabStuff<T>();

如果grabStuff没有移动构造函数,我希望R应该抛出编译时错误,因为这似乎不允许返回类型使用复制构造函数

3 个答案:

答案 0 :(得分:6)

与往常一样,返回引用时,必须返回对函数返回后仍然存活的内容的引用。你如何做到这一点取决于你。例如:

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本身,它返回对你将传递给它的东西的引用(因此调用者有责任提供一个有效输入)。

答案 1 :(得分:1)

取决于您想要使用它做什么,以及您如何实现该功能,这可能是有意义的。

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

答案 2 :(得分:1)

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

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

对于声明语句T instance = grabStuff<T>();,如果T是类类型,我认为在此上下文中xvalue和prvalue之间没有区别。

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