私はこれを理解することはできません:
int main() {
int (*) (int *) = 5;
return 0;
}
上記の割り当ては、g ++ c ++ 11でコンパイルされます。それint (*) (int *)
が(int *)
引数として受け入れてintを返す関数へのポインタであることは知っていますが、それを5と同等にする方法がわかりません。最初は、常に5を返す関数だと思いました(最近の学習からF#、おそらくハハ)、それから私は簡単に、関数ポインタがメモリ位置5を指していると思いましたが、それは明らかに機能せず、16進値も機能しません。
関数がintを返すためである可能性があり、intの割り当ては(どういうわけか)大丈夫だと考えて、私もこれを試しました:
int * (*) (int *) = my_ptr
ここmy_ptr
で、は型int *
であり、int型の最初の場合と同様に、この2番目の関数ポインタと同じ型です。これはコンパイルされません。の代わりに5または任意のint値を割り当ててもmy_ptr
、この関数ポインターに対してはコンパイルされません。
では、割り当てはどういう意味ですか?
アップデート1
ベストアンサーに示されているように、これはバグであることが確認されています。ただし、関数ポインタに割り当てた値に実際に何が起こるのか、または割り当てで何が起こるのかはまだわかりません。それについての(良い)説明は大歓迎です!問題をより明確にするために、以下の編集を参照してください。
編集1
gccバージョン4.8.2(Ubuntu 4.8.2)を使用しています
編集2
実際、それを何かと同等にすることは私のコンパイラで機能します。std :: string変数、またはdoubleを返す関数名と同等でも機能します。
2.1を編集
興味深いことに、ポインタではないデータ型を返す関数への関数ポインタにすると、次のようにコンパイルできます。
std::string (*) () = 5.6;
しかし、関数ポインタが何らかのポインタを返す関数を指すとすぐに、次のようにコンパイルされません。
some_data_type ** (*) () = any_value;