2016-01-25 6 views
6

içinde dönüştürülür:işlev adı bu kodu (geçerli C++ 11) ile garip bir şekilde

#include <stdio.h> 
#include <typeinfo> 

bool my_awesome_func(int param) { 
    return (param > 1); 
} 

int main(int argc, char const *argv[]) { 
    fprintf(stderr, "type of my_awesome_func: %s\n", 
      typeid(my_awesome_func).name()); 
    if (my_awesome_func) { 
    fprintf(stderr, "WHAT???\n"); 
    } 
    return 0; 
} 

soru if deyimi içinde.bana FbiE (işlev türü için gcc dili olduğunu düşünüyorum) gibi bir şey döndürürken, bu türün neden örtülü olarak bool'a dönüştürüldüğünü anlamıyorum (yalnızca bir örnek, int ile çalışır).

Neden if ifadesi derleniyor ve doğru değerlendiriyor?

+8

İşlev adı, bu işleve bir gösterici için bozulur ve imleçler, aksi takdirde "true" ise "false" işleviyle "bool" değerine dolaylı olarak dönüştürülebilir. –

+0

@ T.C. Teşekkürler! İşaretçiye dönüştüğünü öğrendiğimde, o zaman ne olduğunu anlıyorum. – niosus

+5

Size biraz * ibadet * vermek, heh. – Quentin

cevap

9

Kodunuzda döküm yok. Bir oyuncu açık bir dönüşümdür. Sorduğunuzu varsayalım: Bir işlevin örtük dönüşümü boole ne yapar?

Bunun cevabı şöyledir: işlev bir işlev işaretçisine dönüştürülür. Ardından, işlev işareti örtük dönüştürme yoluyla bool'a dönüştürülür. Bu dönüşüm verimli olarak tanımlanır:

  • false başka fonksiyon pointer kodunuzda Yani

için boş fonksiyon pointer

  • true için, if (my_awesome_func) gövdesi daima girilir. (Gerçek bir işlevi bir işlev işaretçisine dönüştürmek asla boş gösterici vermez).

  • +0

    Teşekkürler! Haklısın, kesinlikle örtük bir dönüşüm demek istedim, ama doğru kelimeyi hatırlamıyordum (bazen ingilizce emiyorum). Fonksiyon bir fonksiyon göstergesine dönüştürüldükten sonra dinamikleri anlıyorum, ama daha fazlasını okumak istiyorum. "Typeid" çağrısında dönüşümü gerçekleştirmediğini anlıyorum. Bunun, 'tipid'in kendisine özgü olduğunu biliyorum, ama belki de benzer davranışa sahip başka erkekler var. – niosus