[解決済み】「int main(){([](){})();}」はどのように有効なC++なのでしょうか?
2022-04-18 05:15:34
質問
最近、次のような難解なコードに出会いました。
int main(){(([](){})());}
読みやすくするために、以下のように再フォーマットしてください。
int main(){
(([](){})()); // Um... what?!?!
}
しかし、どのようにして
(([](){})())
は有効なコードです。
- 関数ポインタの構文には見えません。
- 演算子のオーバーロードのようなトリックではありえない。コードはそのままコンパイルされます。
Googleはこのオールシンボル検索ではあまり役に立ちませんでした。しかし、Visual Studio 2010でコンパイルすると、何も出力されない。エラーもなければ、警告もない。だから、有効なコードのように見える。
以外の有効なコードで、ここまで奇抜なものは見たことがない。 ジャバスクリプト と C関数ポインタ .
誰かこれが有効なC++であることを説明できますか?
どのように解決するのですか?
このコードは本質的に空のラムダを呼び出しています。
では、最初から説明しましょう。
[](){}
は、空の
ラムダ式
.
そして、CやC++では、式を括弧で囲むと、全く同じ動作になります。
†
つまり、ラムダを囲む最初のペアはそのような役割を担っているのです。現在、私たちは
([](){})
.
では
()
の後、最初のラップペアは(空の)ラムダを呼び出します。今、私たちは
([](){})()
式全体が再び括弧で包まれ、次のようになります。
(([](){})())
.
とうとう
;
は文を終了します。私たちは
(([](){})());
.
があります。
いくつかの
のように、少なくともC++ではコーナーケースとなります。
T a_var;
という違いがあります。
decltype(a_var)
と
decltype((a_var))
.
関連
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] YAML の文字列を複数行に渡って分割するには?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] Bashで変数で定義された数値の範囲を反復処理するにはどうすればよいですか?
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] JavaScriptで浮動小数点数を整数に変換するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み】C++11のラムダ式って何?