I riferimenti di rvalue a const hanno qualche utilità?

Immagino di no, ma vorrei confermarlo. C’è qualche utilità per const Foo&& , dove Foo è un tipo di class?

Sono occasionalmente utili. Il progetto C ++ 0x stesso li usa in pochi posti, ad esempio:

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

I suddetti due sovraccarichi assicurano che le altre funzioni ref(T&) e cref(const T&) non si leghino ai valori rvalue (che sarebbero altrimenti possibili).

Aggiornare

Ho appena controllato lo standard ufficiale N3290 , che sfortunatamente non è pubblicamente disponibile, e ha in 20.8 oggetti funzione [function.objects] / p2:

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

Poi ho controllato la bozza post-C ++ 11 più recente, che è pubblicamente disponibile, N3485 , e in 20.8 Oggetti funzione [function.objects] / p2 dice ancora:

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

Sono permessi e persino le funzioni sono classificate in base a const , ma poiché non è ansible spostarsi dall’object const riferito da const Foo&& , non sono utili.

Non riesco a pensare a una situazione in cui ciò sarebbe utile direttamente, ma potrebbe essere usato indirettamente:

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

Il T in g è T const, quindi f ‘s x è un T const &&.

È probabile che ciò si traduca in un errore comile in f (quando tenta di spostare o utilizzare l’object), ma f potrebbe prendere un valore-ref in modo che non possa essere chiamato su lvalue, senza modificare il valore rvalue (come nel troppo semplice esempio sopra).