diff --git a/algorithms.tex b/algorithms.tex index d709014a..1f88c886 100644 --- a/algorithms.tex +++ b/algorithms.tex @@ -480,15 +480,17 @@ template O> O fill_n(O first, difference_type_t n, const T& value); - template > O, - Sentinel S> + template S> + requires Callable() && Writable>() O generate(O first, S last, F gen); - template > Rng> + template + requires Callable() && OutputRange>() safe_iterator_t generate(Rng&& rng, F gen); - template > O> + template + requires Callable() && Writable>() O generate_n(O first, difference_type_t n, F gen); template S, class T, class Proj = identity> @@ -2415,15 +2417,17 @@ \indexlibrary{\idxcode{generate}}% \indexlibrary{\idxcode{generate_n}}% \begin{itemdecl} -template > O, - Sentinel S> +template S> + requires Callable() && Writable>() O generate(O first, S last, F gen); -template > Rng> +template + requires Callable() && OutputRange>() safe_iterator_t generate(Rng&& rng, F gen); -template > O> +template + requires Callable() && Writable>() O generate_n(O first, difference_type_t n, F gen); \end{itemdecl} diff --git a/concepts.tex b/concepts.tex index 4079bb4b..4ea86102 100644 --- a/concepts.tex +++ b/concepts.tex @@ -1087,9 +1087,8 @@ \begin{itemdecl} template concept bool Invocable() { - return CopyConstructible() && - requires(F f, Args&&... args) { - invoke(f, std::forward(args)...); // not required to be equality preserving + return requires(F&& f, Args&&... args) { + invoke(std::forward(f), std::forward(args)...); // not required to be equality preserving }; } \end{itemdecl} @@ -1134,7 +1133,7 @@ template concept bool Predicate() { return RegularInvocable() && - Boolean>(); + Boolean>(); } \end{itemdecl} diff --git a/iterators.tex b/iterators.tex index 49515456..72d215cf 100644 --- a/iterators.tex +++ b/iterators.tex @@ -1533,81 +1533,91 @@ \begin{codeblock} template concept bool IndirectInvocable() { - return Invocable(); + return CopyConstructible() && + Invocable(); } template concept bool IndirectInvocable() { return Readable() && - Invocable>() && - Invocable>() && - Invocable>(); + CopyConstructible() && + Invocable&>() && + Invocable>() && + Invocable>(); } template concept bool IndirectInvocable() { return Readable() && Readable() && - Invocable, value_type_t>() && - Invocable, reference_t>() && - Invocable, value_type_t>() && - Invocable, reference_t>() && - Invocable, iter_common_reference_t>(); + CopyConstructible() && + Invocable&, value_type_t&>() && + Invocable&, reference_t>() && + Invocable, value_type_t&>() && + Invocable, reference_t>() && + Invocable, iter_common_reference_t>(); } template concept bool IndirectRegularInvocable() { - return RegularInvocable(); + return CopyConstructible() && + RegularInvocable(); } template concept bool IndirectRegularInvocable() { return Readable() && - RegularInvocable>() && - RegularInvocable>() && - RegularInvocable>(); + CopyConstructible() && + RegularInvocable&>() && + RegularInvocable>() && + RegularInvocable>(); } template concept bool IndirectRegularInvocable() { return Readable() && Readable() && - RegularInvocable, value_type_t>() && - RegularInvocable, reference_t>() && - RegularInvocable, value_type_t>() && - RegularInvocable, reference_t>() && - RegularInvocable, iter_common_reference_t>(); + CopyConstructible() && + RegularInvocable&, value_type_t&>() && + RegularInvocable&, reference_t>() && + RegularInvocable, value_type_t&>() && + RegularInvocable, reference_t>() && + RegularInvocable, iter_common_reference_t>(); } template concept bool IndirectPredicate() { return Readable() && - Predicate>() && - Predicate>() && - Predicate>(); + CopyConstructible() && + Predicate&>() && + Predicate>() && + Predicate>(); } template concept bool IndirectPredicate() { return Readable() && Readable() && - Predicate, value_type_t>() && - Predicate, reference_t>() && - Predicate, value_type_t>() && - Predicate, reference_t>() && - Predicate, iter_common_reference_t>(); + CopyConstructible() && + Predicate&, value_type_t&>() && + Predicate&, reference_t>() && + Predicate, value_type_t&>() && + Predicate, reference_t>() && + Predicate, iter_common_reference_t>(); } template concept bool IndirectRelation() { return Readable() && Readable() && - Relation, value_type_t>() && - Relation, reference_t>() && - Relation, value_type_t>() && - Relation, reference_t>() && - Relation, iter_common_reference_t>(); + CopyConstructible() && + Relation&, value_type_t&>() && + Relation&, reference_t>() && + Relation, value_type_t&>() && + Relation, reference_t>() && + Relation, iter_common_reference_t>(); } template concept bool IndirectStrictWeakOrder() { return Readable() && Readable() && - StrictWeakOrder, value_type_t>() && - StrictWeakOrder, reference_t>() && - StrictWeakOrder, value_type_t>() && - StrictWeakOrder, reference_t>() && - StrictWeakOrder, iter_common_reference_t>(); + CopyConstructible() && + StrictWeakOrder&, value_type_t&>() && + StrictWeakOrder&, reference_t>() && + StrictWeakOrder, value_type_t&>() && + StrictWeakOrder, reference_t>() && + StrictWeakOrder, iter_common_reference_t>(); } template struct indirect_result_of { };