Neden'otomatik olarak dönüş türleri seçtiğini tespit ettik mi?
Son zamanlarda daha Haskell, C-y, ve temelde bu gibi bir işlevi istedik yapmak isteyen bir arkadaşım çalışıyordu:
auto sum(auto a, auto b) {
return a b;
}
Görünüşe göre bu şekilde değiştirdim çok parametre türü olarak otomatik kullanamam:
template<class A, class B>
auto sum(A a, B b) {
return a b;
}
Ama bu da işe yaramıyor. Bizim buna ihtiyacımız var sonuçta ne fark ettim:
template<class A, class B>
auto sum(A a, B b) -> decltype(a b) {
return a b;
}
Yani benim soru, ne anlamı var? Derleyici sadece return deyimi bakabilir beri mi decltype
tekrar bilgi değil mi?
Belki de sadece bir başlık dosyası vardır, böylece ihtiyaç olduğunu düşündüm:
template<class A, class B>
auto sum(A a, B b) -> decltype(a b);
... ama böyle şablonlar zaten kullanamayız.
Düşündüm başka bir şey derleyici için daha kolay olacağını düşünüyorlar, ama aslında daha zor olacak gibi görünüyor.
Durum 1: decltype
decltype
tablo türünü anlamaya- Herhangi bir geri dönüş değerlerinin türlerini anlamak
- Eğer onlar Maç olmadığını görmek
decltype
Olmadan . Durum 2:
- Herhangi bir geri dönüş değerlerinin türlerini anlamak
- Eğer onlar Maç olmadığını görmek
Akılda bu şeyler ile, sondaki nokta decltype
ile döndürme türü nedir?
CEVAP
Eğer aşağıdaki:
template<class A, class B, class C>
auto sum(A a, B b, C c) {
if (rand () == 0) return a b;
// do something else...
return a c;
}
a b
a c
ifadeler nerede .. sonuçlar farklı türü verim.
Derleyici dönüş türü için koymaya karar olduğunu ve neden işlevi ne olmalıdır?
Bu durumda zaten kapsadığı C 11 Lambda vermek için ihmal dönüş türü sürece return
ifadeler olabilir sonucuna aynı tip (NB standart alıntı gereken bazı kaynaklarda iddia sadece bir "dönüş" ifadesidir izin ve bu gcc glitch).
Teknik bir sebebi C tanımı ve bildirimi ayrı olmak üzere ikiye ayrılır.
template<class A, class B>
auto sum(A a, B b) -> decltype(a b);
template<class A, class B>
auto sum(A a, B b) -> decltype(a b)
{
}
Şablon tanımıolabilirbaşlığında. Ya da bir arabirim üzerinden bakıldığında işlev tanımları ve sayfa sayfa taramak zorunda değilsiniz, böylece başka bir dosya olabilir.
C tüm olasılıkları hesaba sahiptir. Sonunda dönüş türleri sadece tanımları fonksiyonu kısıtlayan bir şey bu kadar kolay yapamazsın anlamına gelir:
template<class A, class B>
class Foo
{
auto sum(A a, B b) -> decltype(a b);
}
template<class A, class B>
auto Foo<A, B>::sum(A a, B b) -> decltype(a b)
{
}
Neden eclipse yeni bir proje oluşturma...
Neden değil't Veritabanı-Öneki.bö...
Neden değil't Python'in __in...
Neden "git difftool" bu araç...
Nasıl Boost ulaşmak için kullanılan C ...