_Remove_reference T.Neden std :: move() _Remove_reference olmadan çalışmaz? bildiğiniz gibi
için T veya T & & için T & dönüştürme, için varBen oyuncu bir ruh hali içinde aşağıdaki kod, hiç beklediğim gibi çalışır, ancak yok yapılan hiçbir fikri neden.
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
static void func(){ cout << "1" << endl; }
};
// template<class _Ty>
// struct _Remove_reference<_Ty&>
// { // remove reference
// typedef _Ty _Type;
// static void func(){ cout << "2" << endl; }
// };
//
// template<class _Ty>
// struct _Remove_reference<_Ty&&>
// { // remove rvalue reference
// typedef _Ty _Type;
// static void func(){ cout << "3" << endl; }
// };
template<class _Ty> inline
typename _Remove_reference<_Ty>::_Type&&
move(_Ty&& _Arg)
{ // forward _Arg as movable
typename _Remove_reference<_Ty>::func();
return ((typename _Remove_reference<_Ty>::_Type&&)_Arg);
}
int main(){
int a1= 3;
int&& a2 = move(a1); // can't convert the a1 to int&&
return 0;
}
Her şey referans çöken kuralları ve şablon argümanı indirimi ile ilgili sanırım ama kafam karıştı. Bu konudaki merakımın sıkı uyumaları için paramparça olması gerekiyor.
Şimdiden teşekkürler.
Teşekkürler. Bunu takdir ediyorum. Ama neden kodun açıklamasını kaldırmam gerektiğini merak ediyorum? _remove_reference'ın amacı bunları T'ye dönüştürüyorsa, neden şablon uzmanlığı versonuna ihtiyacım var? –
Uzmanlık alanları, _Remove_reference’ın nasıl çalıştığıdır. Birincil şablon her şeyle eşleşir ve aynı türden döner, bu nedenle '_Remove_reference :: type' sadece' int' dir. Referanslar için kısmi uzmanlık referansları yapar. '_Remove_reference ', ilk kısmi uzmanlık ile eşleşir, bu nedenle birincil şablon yerine kullanılır. ('_Ty ve 'int ve' böylece), böylece de _Remove_reference :: type'' int' bir typedef ** Bu uzmanlık ** içinde, '_Ty' sadece 'int' olup. –
Referans çökmesi için bkz. Http://thbecker.net/articles/rvalue_references/section_08.html. Bütün makale, aslında, sayfa 1'den, iyi bir okumadır. Şeyler bağlamını almak için baştan oku. – wilhelmtell