meta
meta copied to clipboard
Concepts and meta::lambda
There are issues in the interaction between the concept constraints in meta and the lambda implementation that need to be investigated. Concepts are applied when forming a template-id, even before instantiation, so e.g.:
template<class> concept Foo = false;
template<Foo T> struct X;
using U = X<int>; // ill-formed despite not instantiating X<int>
Yet the implementation of lambdas relies on the ability to name "invalid" specializations which are later pattern-matched and substituted into valid specializations. GCC's concept implementation is lax enough that we've been getting by with some cheating in cmcstl2, but clang-concepts (and I suspect other implementations of C++20 concepts) refuses to compile the lambda test cases in meta.cpp.
Working my way down meta.cpp, on line 67 (the last type alias (outer
) in Res tuple_cat(Tuples &&... tpls)
):
quote_i<std::size_t, make_index_sequence>
fails Invocable
(in a static_assert
). quote<std::index_sequence_for>
as a replacement works (not a good solution, but at least allows me down to the lambda tests).