[解決済み] int (*) (int *) = 5 (または任意の整数値)の意味するところ
質問
これがわからないのです。
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)で問題を再現できました。
関連
-
[解決済み】C++の余分な資格エラー
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] なぜ (int)x ではなく static_cast<int>(x) を使うのですか?
-
[解決済み] 些細なキーの場合、unordered_mapよりもmapを使用する利点はありますか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】std::unique_ptr<T>はTの完全な定義を知るために必要なのでしょうか?
-
[解決済み] delete[]が配列であることをどうやって知るのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。