C++ 標準セクションのドラフトを見ると、5.1.2
ラムダ式の段落2には次のように書かれています (私のものは今後も強調されます)。
ラムダ式の評価は、一時的な prvalue (12.2) になります。この一時的なものはクロージャー オブジェクトと呼ばれます。ラムダ式は、未評価のオペランドに現れてはなりません(第 5 節)。[ 注: クロージャー オブジェクトは関数オブジェクト (20.8) のように動作します。—終了注]
およびセクション5.19
定数式の段落2は次のように述べています。
conditional-expressionは、潜在的に評価される部分式 (3.2) として次のいずれかが含まれていない限り、コア定数式ですが、評価されない論理 AND (5.14)、論理 OR (5.15)、および条件付き (5.16) 演算の部分式は含まれません。考慮されません[...]
次の箇条書きがあります。
— ラムダ式 (5.1.2);
では、評価されていないオペランドではラムダ式が許可されていないのに、定数式の評価されていない部分では許可されているのはなぜでしょうか?
各ラムダには一意の型があるため、評価されていないオペランドの場合、いくつかのケース ( decltypeまたはtypeid ) の型情報があまり役に立たないことがわかります。定数式の未評価のコンテキストでそれらを許可したい理由は明らかではありませんが、おそらくSFINAEを許可するためでしょうか?