コンテキストを利用する式

メモ。

コンテキストによって動作が変わるもののうち、忘れそうなもの。
(こういうのってレフトコンテキストとか呼ぶんでしたっけ)

代入コンテキスト

メソッドの型推論規則が多少変化する(場合がある)。
詳しくは代入変換とメソッド起動変換 - しげるメモに。

配列初期化コンテキスト

配列初期化子を式とみなした際の評価結果が変わる。ついでに、配列初期化コンテキストは代入コンテキストでもあるため、正確に解析してないとまずい。

int[][][] a = {t(), { t() }, {{ t() }}};
long[][][] b = {t(), { t() }, {{ t() }}};
<T> T t() {}

括弧付きの式の取扱い

括弧の使用は、非常に興味深い例外を一つ除き、評価の順序に対してのみ影響を与える。

15.8.5 Parenthesized Expressions

とのことで、コンテキストを引き継ぐ模様。つまり、

ParenthesizedExpression:
    ( Expression )

のExpressionにおいて、代入コンテキスト、および配列初期化コンテキストはParenthesizedExpressionのそれらに一致する。