How is "int main(){(([](){})());}" valid C++? Ask Question

How is

I recently came across the following esoteric piece of code.

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

Reformat it as follows to make it more readable:

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

But I can't get my head around how (([](){})()) is valid code.

  • It doesn't look like function pointer syntax.
  • It can't be some operator overloading trick. The code compiles as is.

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

私は、 JavascriptC 関数ポインター以外で、これほど奇妙な有効なコードを見たことがありません。

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

ベストアンサー1

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

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

次に、C および C++ では、式を括弧で囲むと、括弧なしで記述した場合とまったく同じように動作します。これが、ラムダを囲む最初の括弧の役割です。現在は です([](){})

そして、()最初の括弧の後に(空の)ラムダを呼び出します。これで([](){})()

式全体を再び括弧で囲むと、 になります(([](){})())

最後に、;文は終わります。 に到達します(([](){})());


†少なくとも C++ では、の間に違いがあるなど、いくつかの特殊なケースがあります。T a_var; decltype(a_var)decltype((a_var))

おすすめ記事