2015-09-08 9 views
15

, bu soru ben kolay yolu auto mul(T x, U y) -> decltype(x*y) yazmak için anlamak ???Bu sözdizimi nedir "decltype (* (T *) (0) ** (U *) (0))" demek? Ben <a href="https://isocpp.org/wiki/faq/cpp11-language-misc#suffix-return" rel="noreferrer">this question on isocpp FAQ here</a> okuyorum

template<class T, class U> 
??? mul(T x, U y) 
{ 
return x*y; 
} 

için dönüş türü nasıl yazılacağını anlatan edilir ancak soru da tarafından ??? yerini alacak başka bir yol verir decltype(*(T*)(0)**(U*)(0)). Ama bu decltype(*(T*)(0)**(U*)(0)) gerçekten ne yaptığını tam olarak anlamadım, bu geçici bir işaretçi T* ilan ve görünür sıfırlamak ve sonra işaretçi, daha sonra U tür için aynı karşılığı ile çoğaltılır, benim anlayış doğru mu?

Ancak neden işaretçileri kullanıyorsunuz? Bence decltype(T(0)*U(0)) veya decltype(T{0}*U{0}) da çalışmalıdır.

+2

yapar 've' U' tek bir tamsayı parametresi alan bir kurucu var. İşaretçi yolu "T" ve "U" yapımcıları hakkında bir varsayım yapmaz. –

+4

Not, [değerlendirilmemiş bir bağlamda] olduğu için tanımlanmamış bir davranış değildir (http://stackoverflow.com/a/28723577/1708801) –

cevap

20
decltype(*(T*)(0)**(U*)(0)) 

edelim bölünmüş it up:

(T*)(0) //cast a null pointer to a T* 
*(T*)(0) //dereference, giving a T 

(U*)(0) //cast a null pointer to a U* 
*(U*)(0) //dereference, giving a U 

(*(T*)(0)) * (*(U*)(0)) //the result of multiplying a U and a T 

decltype(T(0)*U(0)) yalnızca T ve U tek int (örtük bir tamsayı değişmezi gelen dönüştürülebilir ya da bir şey) alarak kurucuya sahip eşdeğerdir.

standart kütüphane zaten daha temiz bir şekilde bunu yapmanın bir std::declval sahiptir:

decltype(std::declval<T>() * std::declval<U>()) 
0

eğilimli bu gerçekten hata.

çözümünüzde, temel olarak construcor'un argüman olarak 0 alabileceğini ve durumun böyle olmayabileceğini varsaymaktasınız.

pasajı temelde bazı T nesne işaretçisi NULL döküm, ardından * operatörle T çekin, şimdi biz derleme zamanında, decltype gerçek türüne göre ve çalışma zamanında değiştirilir varsayar temelde decltype({T object}*{U object}) sol işaretçi olmayacak. ama bu kod çok çirkin ve sürdürülemez.

daha iyi bir çözüm kullanmaktır C++ 11 std::result_of:
typename std::result_of<declval<T>()*declval<U>()>::type

declval T 'varsayar sadece r-değeri referans (T&& anlamına gelir) döndürür *(T*)(0) benzer bir şey

+4

Bu, sonuç_of'un ne için olduğu değil ve burada derleme yapmaz. – Barry

İlgili konular