ericniebler / meta

A tiny metaprogramming library
Boost Software License 1.0
302 stars 47 forks source link

Concepts and meta::lambda #65

Open CaseyCarter opened 5 years ago

CaseyCarter commented 5 years ago

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.

kedarbhat commented 5 years ago

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).