283

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

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

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

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

(([](){})())しかし、有効なコードがどのように機能するかについて頭を悩ませることはできません。

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

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

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

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

4

1 に答える 1

292

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

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

次に、C および C++ では、式を括弧で囲むことができます。式は括弧なしで記述された場合とまったく同じ†</sup> として動作するため、ラムダを囲む最初の括弧のペアが動作します。現在 です([](){})

次に、()最初の折り返しの後、括弧が (空の) ラムダを呼び出します。私たちは今([](){})()

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

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


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

于 2012-11-28T10:51:48.103 に答える