A "meta" is an object holding metadata deduced from a type at compile
time, stored in or referenced by a proxy. proxy creates, copies,
assigns, and destroys metadata in contexts specified not to throw, but
nothing required a reflector to actually support those operations
without throwing, or to be default-constructible at all.
Define the ProBasicMeta and ProMeta named requirements, and enforce them
via the new basic_meta, meta, and basic_reflection concepts.
is_reflector_well_formed() now checks meta<R, T> rather than plain
constructibility, so a reflector that can throw, or that cannot be
default-constructed, copied, or assigned, is no longer proxiable and is
diagnosed as a reflection that is not implemented.
This tightens proxiable: a reflector whose constructor may throw was
previously accepted.
A "meta" is an object holding metadata deduced from a type at compile time, stored in or referenced by a proxy. proxy creates, copies, assigns, and destroys metadata in contexts specified not to throw, but nothing required a reflector to actually support those operations without throwing, or to be default-constructible at all.
This PR writes those obligations down and enforces them.
Breaking change. A reflector whose constructor may throw, or that cannot be default-constructed, copied, or assigned, is no longer proxiable and is diagnosed as a reflection that is not implemented. Reflectors in the tests and in the documented examples are updated accordingly.