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 でコンパイルしても何も出力されません。エラーも警告もありませんでした。したがって、有効なコードのように見えます。
私は、 JavascriptとC 関数ポインター以外で、これほど奇妙な有効なコードを見たことがありません。
これが有効な C++ である理由を誰か説明できますか?
ベストアンサー1
コードは本質的に空のラムダを呼び出します。
最初から始めましょう:[](){}
は空のラムダ式です。
次に、C および C++ では、式を括弧で囲むと、括弧なしで記述した場合とまったく同じように動作します†。これが、ラムダを囲む最初の括弧の役割です。現在は です([](){})
。
そして、()
最初の括弧の後に(空の)ラムダを呼び出します。これで([](){})()
式全体を再び括弧で囲むと、 になります(([](){})())
。
最後に、;
文は終わります。 に到達します(([](){})());
。
†少なくとも C++ では、との間に違いがあるなど、いくつかの特殊なケースがあります。T a_var;
decltype(a_var)
decltype((a_var))