做rvalue引用const有什么用?

我想不是,但我想确认一下。 有什么用的const Foo&& ,其中Foo是一个类的types?

他们偶尔有用。 C ++ 0x本身在一些地方使用它们,例如:

 template <class T> void ref(const T&&) = delete; template <class T> void cref(const T&&) = delete; 

上述两个重载确保另一个ref(T&)cref(const T&)函数不会绑定到右值(否则这是可能的)。

更新

我刚刚检查了官方的标准N3290 ,不幸的是不公开的,它已在20.8函数对象[function.objects] / p2:

 template <class T> void ref(const T&&) = delete; template <class T> void cref(const T&&) = delete; 

然后,我检查了最新的Post-C ++ 11草案,它是公开可用的N3485 ,在20.8函数对象[function.objects] / p2中,它仍然说:

 template <class T> void ref(const T&&) = delete; template <class T> void cref(const T&&) = delete; 

它们是被允许的,甚至是基于constsorting的const ,但是由于你不能从const Foo&&引用的const Foo&&对象移动,所以它们是没有用的。

我想不出直接有用的情况,但可以间接使用:

 template<class T> void f(T const &x) { cout << "lvalue"; } template<class T> void f(T &&x) { cout << "rvalue"; } template<class T> void g(T &x) { f(T()); } template<class T> void h(T const &x) { g(x); } 

T中g是T常量,所以f的x是T const &&。

这可能会导致f中的一个comile错误(当它试图移动或使用该对象时),但是f可以采用rvalue-ref,这样它就不能在左值上被调用,而不会修改右值(就像太简单上面的例子)。