做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;
它们是被允许的,甚至是基于const
sorting的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,这样它就不能在左值上被调用,而不会修改右值(就像太简单上面的例子)。