1. ホーム
  2. c++

[解決済み】「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)) .