1. ホーム
  2. c++

[解決済み] int (*) (int *) = 5 (または任意の整数値)の意味するところ

2023-04-22 21:25:32

質問

これがわからないのです。

int main() {
    int (*) (int *) = 5;
    return 0;
}

上記の課題は g++ c++11 でコンパイルされます。 int (*) (int *) を受け入れる関数へのポインタであることは知っています。 (int *) を引数として受け取り、intを返す関数へのポインタですが、これを5と同一視するのは理解できません。最初は、常に5を返す関数だと思い(最近F#で勉強したせいです、たぶん、ハハ)、次に、関数ポインタはメモリロケーション5を指していると、簡単に思いましたが、それは明らかにうまくいかず、16進数値もうまくいきません。

関数がintを返すからかもしれない、intを代入するのは(どういうわけか)OKだ、と考えて、これも試してみました。

int * (*) (int *) = my_ptr

ここで my_ptr はタイプ int * のように、この2番目の関数ポインタと同じ型になります。これはコンパイルできません。5 または任意の int 値を my_ptr の代わりに 5 または任意の int 値を割り当てても、この関数ポインタのためにコンパイルされません。

では、この代入は何を意味するのでしょうか?

アップデート1

ベストアンサーにあるように、バグであることは確認できました。しかし、実際に何が が起こる を関数ポインタに代入するとどうなるのか、あるいは代入によって何が起こるのかはまだ分かっていません。それについて、何か(良い)説明があれば、とてもありがたいです 問題をより明確にするために、以下の編集を参照してください。

編集1

gcc version 4.8.2 (in Ubuntu 4.8.2) を使用しています。

編集2

実際、私のコンパイラでは、それを何にでも等価にすることができます。std::string変数やdoubleを返す関数名と等しくしても、動作します。

2.1 を編集

興味深いことに、ポインタではないデータ型を返す関数へのポインタにすることで、次のようにコンパイルできるようになります。

std::string (*) () = 5.6;

しかし、関数ポインタが何らかのポインタを返す関数になった途端、次のようにコンパイルされなくなります。

some_data_type ** (*) () = any_value;

どのように解決するのですか?

g++のバグです。

 int (*) (int *) 

は型名です。

C++では、識別子を持たない型名での宣言はできません。

というわけで、これはg++でコンパイルします。

 int (*) (int *) = 5;

で、これもコンパイルされます。

 int (*) (int *);

となっていますが、どちらも無効な宣言です。

EDIT :

T.C. コメント欄での言及 bugzilla バグ 60680 同様のテストケースで がありますが、まだ承認されていません . バグはbugzillaで確認されています。

EDIT2 :

上記2つの宣言がファイルスコープにある場合、g++は正しく診断を発行します(ブロックスコープでは診断に失敗します)。

EDIT3 :

確認したところ、g++の最新リリース版4(4.9.2)、最新プレリリース版5(5.0.1 20150412)、最新実験版6(6.0.0 20150412)で問題を再現できました。