|
1179 | 1179 | requires(const remove_cvref_t<Rcvr>& rcvr) { |
1180 | 1180 | { get_env(rcvr) } -> @\exposconcept{queryable}@; |
1181 | 1181 | } && |
1182 | | - @\libconcept{move_constructible}@<remove_cvref_t<Rcvr>> && // rvalues are movable, and |
1183 | | - @\libconcept{constructible_from}@<remove_cvref_t<Rcvr>, Rcvr>; // lvalues are copyable |
| 1182 | + @\libconcept{move_constructible}@<remove_cvref_t<Rcvr>> && // rvalues are movable, and |
| 1183 | + @\libconcept{constructible_from}@<remove_cvref_t<Rcvr>, Rcvr> && // lvalues are copyable, and |
| 1184 | + is_nothrow_move_constructible_v<remove_cvref_t<Rcvr>>; // no-throw-movable |
1184 | 1185 |
|
1185 | 1186 | template<class Signature, class Rcvr> |
1186 | 1187 | concept @\defexposconcept{valid-completion-for}@ = // \expos |
|
2860 | 2861 | Otherwise, \tcode{\exposid{connect-awaitable}(new_sndr, rcvr)}. |
2861 | 2862 | \end{itemize} |
2862 | 2863 | Except that \tcode{rcvr} is evaluated only once. |
| 2864 | +The program is ill-formed, no diagnostic required, |
| 2865 | +if there exists an rvalue expression \tcode{rcvr2} such that: |
| 2866 | +\begin{itemize} |
| 2867 | +\item \tcode{decltype(rcvr2)} models \libconcept{receiver}, |
| 2868 | +\item \tcode{noexcept(rcvr2)} is \tcode{true}, |
| 2869 | +\item \tcode{is_same_v<decltype(get_env(rcvr2)), decltype(get_env(rcvr))>} is \tcode{true}, |
| 2870 | +\item \tcode{noexcept(execution::connect(sndr, rcvr))} is \tcode{true}, and |
| 2871 | +\item \tcode{noexcept(execution::connect(sndr, rcvr2))} |
| 2872 | +is well-formed and evaluates to \tcode{false}. |
| 2873 | +\end{itemize} |
| 2874 | +\begin{note} |
| 2875 | +This allows determination of whether \tcode{connect} throws |
| 2876 | +with only the context of the environment, |
| 2877 | +such as within \tcode{get_completion_signatures}. |
| 2878 | +\end{note} |
2863 | 2879 |
|
2864 | 2880 | \mandates |
2865 | 2881 | The following are \tcode{true}: |
|
0 commit comments