ラムダ式は未評価のコンテキスト(decltypeなど)では使用できず、最近まで定数式にすることはできませんでした。したがって、テンプレート引数でそれらを使用する方法はありませんでした。非形式のテンプレート引数でconstexprラムダを評価しました
C++では、定数式lambdaが使用できます。これは一般的にテンプレート引数でそれらを使用することはできません。しかし、具体的例えば定数式ラムダ式が評価コンテキストで使用できる非型テンプレート引数、用
:
template<int N> struct S { constexpr static int value = N; };
int main() {
int N = S<[]()constexpr{return 42;}()>::value;
}
まだかかわらず、動作しない、ラムダ式が明示的にテンプレートで禁止されているので、型または非型の引数。
私の質問は、上記の構造を許可していないという背後にある理由です。関数シグニチャのlambdaの型は問題があるかもしれないが、ここではクロージャの型自体は無関係で、(コンパイル時定数)戻り値のみが使用されることを理解できます。
私はラムダボディのすべてのステートメントがテンプレート引数式の一部になると考えています。したがって、ボディ内のステートメントが置換中に作成されていない場合、SFINAEを適用する必要があります。おそらくそれはコンパイラ開発者からの重要な仕事を必要とするでしょう。
しかし、それは実際に私の動機です。上記の構文を使用することができた場合、SFINAEは定数式だけでなく、constexpr関数で有効な他のステートメント(例えば、リテラル型宣言)でも使用できます。
コンパイラライターに与える影響に加えて、これが原因で発生する問題はありますか?標準における曖昧さ、矛盾、合併症?
私はあなたがあなた自身の質問に答えだと思います。 – Barry
まあ、+1 @バリーこれは実際に興味深いQ/Aです。 – skypjack
@Barry私は少し質問を修正しました。私はこれが確かに唯一の主な理由であるとの確証を期待しました。おそらく、推論に言及した委員会の論文/議論への言及がありました。 – user4407569