Immagino di no, ma vorrei confermarlo. C'è qualche uso per const Foo&&
, dove Foo
è un tipo di classe?I riferimenti di rvalue a const hanno qualche utilità?
risposta
Sono occasionalmente utili. Il progetto di C++ 0x stesso li usa in alcuni punti, ad esempio:
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
I suddetti due overload garantire che le altre ref(T&)
e cref(const T&)
funzioni non si legano alle rvalues (che sarebbe altrimenti possibile).
Aggiornamento
Ho appena controllato lo standard ufficiale N3290, che purtroppo non è disponibile al pubblico, ed ha in oggetti 20.8 Funzione [function.objects]/p2:
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
Poi ho controllato la bozza post-C++ 11 più recente, che è disponibile pubblicamente, N3485 e in 20.8 oggetti funzione [function.objects]/p2 dice ancora:
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
Guardando [cppreference] (http://en.cppreference.com/w/cpp/utility/functional/ref) sembra che questo non sia più il caso. Qualche idea, perché? Viene usato qualsiasi altro luogo 'const T &&'? – Pubby
In realtà, cppreference potrebbe non visualizzare semplicemente le funzioni cancellate. Non ho controllato lo standard. – Pubby
@Pubby cppreference visualizza certamente le funzioni cancellate, quelle sono state omesse per errore. – Cubbi
Sono consentiti e persino le funzioni classificate in base a const
, ma poiché non è possibile spostarsi dall'oggetto const indicato da const Foo&&
, non sono utili.
Cosa intendi esattamente per commento "classificato"? Qualcosa che ha a che fare con la risoluzione del sovraccarico, immagino? – fredoverflow
Perché non è possibile passare da un valore const-ref, se il tipo specificato ha uno spostamento ctor che accetta un valore const-ref? –
@FredOverflow, la classifica del sovraccarico è questa: 'const T &, T &, const T &&, T &&' –
non riesco a pensare a una situazione in cui questo sarebbe utile direttamente, ma potrebbe essere usato indirettamente:
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);
}
Il T in g è T const, quindi f 'SX è un T const & &.
È probabile che questo si traduce in un errore comile in f (quando si tenta di spostare o utilizzare l'oggetto), ma f potrebbe prendere una rvalue-ref modo che non può essere chiamato lvalue, senza modificare il valore (come nell'esempio troppo semplice sopra).
In questo video, STL dice 'const &&' sono molto importanti, anche se non dice perché: https://www.youtube.com/watch?v=JhgWFYfdIho#t=54m20s –