这样的返回类型是否代表c ++ 11中有意义的东西?
template <typename R>
R&& grabStuff();
T instance = grabStuff<T>();
如果grabStuff
没有移动构造函数,我希望R
应该抛出编译时错误,因为这似乎不允许返回类型使用复制构造函数
答案 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引用参数的复制构造函数,那么将选择此复制构造函数,并且没有错误。我不知道你为什么要这是一个错误。如果这是一个错误,那么当从右值初始化某个对象时,任何旧代码都将是不正确的。