Bunu çözemiyorum:
int main() {
int (*) (int *) = 5;
return 0;
}
Yukarıdaki atama, g ++ c ++ 11 ile derlenir. Bunun int (*) (int *)bir (int *)argüman olarak kabul eden ve bir int döndüren bir işleve işaret eden bir işaretçi olduğunu biliyorum , ancak onu 5'e nasıl eşitleyebileceğinizi anlamıyorum. İlk başta bunun sürekli olarak 5 döndüren bir işlev olduğunu düşündüm (son öğrendiğimden F #, muhtemelen, haha), sonra kısaca, işlev göstericisinin bellek konumu 5'i gösterdiğini düşündüm, ancak bu açıkça çalışmıyor ve onaltılık değerler de yapmıyor.
Bunun işlevin bir int döndürmesi ve int atamanın tamam (bir şekilde) olmasından kaynaklandığını düşünerek, şunu da denedim:
int * (*) (int *) = my_ptr
my_ptrtip neredeint * , int türündeki ilk durumda olduğu gibi bu ikinci işlev göstericisiyle aynı tür. Bu derlemez. Bunun yerine 5 veya herhangi bir int değeri atamak, my_ptrbu işlev göstericisi için de derlenmez.
Öyleyse görev ne anlama geliyor?
Güncelleme 1
En iyi yanıtta gösterildiği gibi bunun bir hata olduğuna dair teyit aldık. Ancak, yine de gerçekte neyi bilinmemektedir olur sen işlev işaretçisi atamak bu değere, ya da ne görevle olur için. Bununla ilgili herhangi bir (iyi) açıklama çok takdir edilecektir! Sorunla ilgili daha fazla netlik için lütfen aşağıdaki düzenlemelere bakın.
Düzenle 1
Gcc 4.8.2 sürümünü kullanıyorum (Ubuntu 4.8.2'de)
Düzenle 2
Aslında, onu derleyicimde işe yarayan herhangi bir şeye eşitlemek. Bunu bir std :: string değişkenine veya double döndüren bir işlev adına eşitlemek bile işe yarar.
Düzenleme 2.1
İlginç bir şekilde, işaretçi olmayan bir veri türünü döndüren herhangi bir işlevin işlev göstericisi yapmak, derlemesine izin verir,
std::string (*) () = 5.6;
Ancak işlev işaretçisi, bir işaretçi döndüren bir işleve gelir gelmez, derleme yapmaz, örneğin
some_data_type ** (*) () = any_value;