2011-02-08 13 views
60

Sanırım değil ama teyit etmek istiyorum. const Foo&& için herhangi bir kullanım, Foo bir sınıf tipidir var mı?const için rvalue referansları herhangi bir kullanım var mı?

+1

, STL nedenini söylemez rağmen 'const &&' çok önemli olduğunu söylüyor "derecelendirildi" ifadesi? Aşırı yükleme çözünürlüğü ile ilgili bir şey var mı? Verilen tip bir const rvalue-ref götüren bir hamle ctor varsa –

cevap

57

Bunlar bazen yararlıdır. Taslak C++ 0x kendisi örneğin, birkaç yerde bunları kullanır:

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

yukarıdaki iki aşırı yükler, diğer ref(T&) ve cref(const T&) fonksiyonları SağDeğerler (Aksi mümkün olurdu) bağlamak etmediğinden emin.

Güncelleme

Sadece maalesef kamuya açık olmayan resmi standardını N3290, kontrol ettik ve 20.8 Fonksiyon/p2 [function.objects] nesneleri de vardır:

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

Son olarak, en son post-C++ 11 taslağını, halka açık olan N3485 ve 20.8 İşlev nesnelerinde [function.objects]/p2 olarak kontrol ettim:

template <class T> void ref(const T&&) = delete; 
template <class T> void cref(const T&&) = delete; 
012 https://www.youtube.com/watch?v=JhgWFYfdIho#t=54m20s
+0

[cppreference] 'a bakarak (http://en.cppreference.com/w/cpp/utility/functional/ref) artık böyle değil. Herhangi bir fikir neden? Başka herhangi bir yerde 'const T && kullanılır? – Pubby

+0

Aslında, cpferans silinmiş işlevleri göstermeyebilir. Standardı kontrol etmedim. – Pubby

+0

@Pubby cppreference kesinlikle silinen işlevleri görüntüler, bunlar yanlışlıkla atlandı. – Cubbi

2

İzin verilir ve işlevler const'a göre sıralanır, ancak const Foo&& tarafından belirtilen const nesnesinden taşıyamayacağınız için bunlar kullanışlı değildir.

+0

tam olarak ne demek istiyorsunuz: Bu videoda – fredoverflow

+0

Neden bir const rvalue-ref hareket edemedi? –

+3

@FredOverflow, aşırı sıralaması şudur: 'const T & T & const T && T &&' –

1

Bunun doğrudan yararlı olacak bir durum düşünemiyorum, ama dolaylı olarak kullanılabilecek:

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 kadar f 'sx deyişle, T const olan Bir T const & &.

O muhtemeldir (taşımak veya nesneyi kullanmaya çalıştığında) bu f bir comile hatasına yol açar, ama f değiştirmeden, bu SolDeğerler çağrıda olamaz böylece bir rvalue-ref sürebilir rvalue (yukarıdaki çok basit örnekte olduğu gibi).

İlgili konular