最近、次の難解なコードに出会いました。
int main(){(([](){})());}
次のように再フォーマットして、読みやすくします。
int main(){
(([](){})()); // Um... what?!?!
}
しかし、私は_(([](){})())
は有効なコードです。
Googleは、このすべてのシンボルを検索するのにあまり役に立ちませんでした。ただし、Visual Studio 2010でコンパイルされ、何も出力されません。エラーも警告もありませんでした。したがって、有効なコードのように見えます。
Javascript および C function pointers の外ではとても奇妙な有効なコードを見たことがない。
誰かがこれが有効なC++である方法を説明できますか?
コードは基本的に空のラムダを呼び出します。
最初から始めましょう:[](){}
は空の lambda式 です。
次に、CおよびC++では、式を括弧で囲むことができ、それらはまったく同じように動作します† それらなしで書かれているかのように、それがラムダの周りの最初のペアのペアレンがすることです。これで_([](){})
_になりました。
次に、最初のラッピング括弧の後に_()
_が(空の)ラムダを呼び出します。私たちは今_([](){})()
_にいます
式全体が再び括弧で囲まれ、_(([](){})())
_が得られます。
最後に、_;
_はステートメントを終了します。 _(([](){})());
_に到着します。
†_T a_var;
_のように、少なくともC++にはsomeコーナーケースがあります decltype(a_var)
とdecltype((a_var))
には違いがあります 。