2011-02-08 2 views

risposta

57

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; 
+0

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

+0

In realtà, cppreference potrebbe non visualizzare semplicemente le funzioni cancellate. Non ho controllato lo standard. – Pubby

+0

@Pubby cppreference visualizza certamente le funzioni cancellate, quelle sono state omesse per errore. – Cubbi

2

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.

+0

Cosa intendi esattamente per commento "classificato"? Qualcosa che ha a che fare con la risoluzione del sovraccarico, immagino? – fredoverflow

+0

Perché non è possibile passare da un valore const-ref, se il tipo specificato ha uno spostamento ctor che accetta un valore const-ref? –

+3

@FredOverflow, la classifica del sovraccarico è questa: 'const T &, T &, const T &&, T &&' –

1

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).