web-dev-qa-db-ja.com

「int main(){(([](){})());}」はどのように有効なC ++ですか?

最近、次の難解なコードに出会いました。

int main(){(([](){})());}

次のように再フォーマットして、読みやすくします。

int main(){
    (([](){})());   //  Um... what?!?!
}

しかし、私は_(([](){})())は有効なコードです。

  • 関数ポインター構文のようには見えません。
  • オペレーターのオーバーロードトリックになることはありません。コードはそのままコンパイルされます。

Googleは、このすべてのシンボルを検索するのにあまり役に立ちませんでした。ただし、Visual Studio 2010でコンパイルされ、何も出力されません。エラーも警告もありませんでした。したがって、有効なコードのように見えます。

Javascript および C function pointers の外ではとても奇妙な有効なコードを見たことがない。

誰かがこれが有効なC++である方法を説明できますか?

259
Mysticial

コードは基本的に空のラムダを呼び出します。

最初から始めましょう:[](){}は空の lambda式 です。

次に、CおよびC++では、式を括弧で囲むことができ、それらはまったく同じように動作します それらなしで書かれているかのように、それがラムダの周りの最初のペアのペアレンがすることです。これで_([](){})_になりました。

次に、最初のラッピング括弧の後に_()_が(空の)ラムダを呼び出します。私たちは今_([](){})()_にいます

式全体が再び括弧で囲まれ、_(([](){})())_が得られます。

最後に、_;_はステートメントを終了します。 _(([](){})());_に到着します。


†_T a_var;_のように、少なくともC++にはsomeコーナーケースがあります decltype(a_var)decltype((a_var))には違いがあります

272
Xeo